@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,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;
11
9
 
10
+ use Latte;
12
11
  use Latte\Compiler\Nodes\Html\ElementNode;
13
12
  use Latte\ContentType;
14
- use Latte\Runtime\Filters;
13
+ use Latte\Runtime\Helpers;
14
+ use Latte\Runtime\HtmlHelpers;
15
+ use function in_array, is_string, str_starts_with, strtolower;
15
16
 
16
17
 
17
18
  /**
@@ -23,8 +24,7 @@ final class Escaper
23
24
  Text = 'text',
24
25
  JavaScript = 'js',
25
26
  Css = 'css',
26
- ICal = 'ical',
27
- Url = 'url';
27
+ ICal = 'ical';
28
28
 
29
29
  public const
30
30
  HtmlText = 'html',
@@ -36,55 +36,49 @@ final class Escaper
36
36
 
37
37
  private const Convertors = [
38
38
  self::Text => [
39
- self::HtmlText => 'escapeHtmlText',
40
- self::HtmlAttribute => 'escapeHtmlAttr',
41
- self::HtmlAttribute . '/' . self::JavaScript => 'escapeHtmlAttr',
42
- self::HtmlAttribute . '/' . self::Css => 'escapeHtmlAttr',
43
- self::HtmlAttribute . '/' . self::Url => 'escapeHtmlAttr',
44
- self::HtmlComment => 'escapeHtmlComment',
45
- 'xml' => 'escapeXml',
46
- 'xml/attr' => 'escapeXml',
39
+ self::HtmlText => 'HtmlHelpers::escapeText',
40
+ self::HtmlAttribute => 'HtmlHelpers::escapeAttr',
41
+ self::HtmlAttribute . '/' . self::JavaScript => 'HtmlHelpers::escapeAttr',
42
+ self::HtmlAttribute . '/' . self::Css => 'HtmlHelpers::escapeAttr',
43
+ self::HtmlComment => 'HtmlHelpers::escapeComment',
44
+ 'xml' => 'XmlHelpers::escapeText',
45
+ 'xml/attr' => 'XmlHelpers::escapeAttr',
47
46
  ],
48
47
  self::JavaScript => [
49
- self::HtmlText => 'escapeHtmlText',
50
- self::HtmlAttribute => 'escapeHtmlAttr',
51
- self::HtmlAttribute . '/' . self::JavaScript => 'escapeHtmlAttr',
52
- self::HtmlRawText . '/' . self::JavaScript => 'convertJSToHtmlRawText',
53
- self::HtmlComment => 'escapeHtmlComment',
48
+ self::HtmlText => 'HtmlHelpers::escapeText',
49
+ self::HtmlAttribute => 'HtmlHelpers::escapeAttr',
50
+ self::HtmlAttribute . '/' . self::JavaScript => 'HtmlHelpers::escapeAttr',
51
+ self::HtmlRawText . '/' . self::JavaScript => 'HtmlHelpers::convertJSToRawText',
52
+ self::HtmlComment => 'HtmlHelpers::escapeComment',
54
53
  ],
55
54
  self::Css => [
56
- self::HtmlText => 'escapeHtmlText',
57
- self::HtmlAttribute => 'escapeHtmlAttr',
58
- self::HtmlAttribute . '/' . self::Css => 'escapeHtmlAttr',
59
- self::HtmlRawText . '/' . self::Css => 'convertJSToHtmlRawText',
60
- self::HtmlComment => 'escapeHtmlComment',
55
+ self::HtmlText => 'HtmlHelpers::escapeText',
56
+ self::HtmlAttribute => 'HtmlHelpers::escapeAttr',
57
+ self::HtmlAttribute . '/' . self::Css => 'HtmlHelpers::escapeAttr',
58
+ self::HtmlRawText . '/' . self::Css => 'HtmlHelpers::convertJSToRawText',
59
+ self::HtmlComment => 'HtmlHelpers::escapeComment',
61
60
  ],
62
61
  self::HtmlText => [
63
- self::HtmlAttribute => 'convertHtmlToHtmlAttr',
64
- self::HtmlAttribute . '/' . self::JavaScript => 'convertHtmlToHtmlAttr',
65
- self::HtmlAttribute . '/' . self::Css => 'convertHtmlToHtmlAttr',
66
- self::HtmlAttribute . '/' . self::Url => 'convertHtmlToHtmlAttr',
67
- self::HtmlComment => 'escapeHtmlComment',
68
- self::HtmlRawText . '/' . self::HtmlText => 'convertHtmlToHtmlRawText',
62
+ self::Text => 'HtmlHelpers::convertHtmlToText',
63
+ self::HtmlAttribute => 'HtmlHelpers::convertHtmlToAttr',
64
+ self::HtmlAttribute . '/' . self::JavaScript => 'HtmlHelpers::convertHtmlToAttr',
65
+ self::HtmlAttribute . '/' . self::Css => 'HtmlHelpers::convertHtmlToAttr',
66
+ self::HtmlComment => 'HtmlHelpers::escapeComment',
67
+ self::HtmlRawText . '/' . self::HtmlText => 'HtmlHelpers::convertHtmlToRawText',
69
68
  ],
70
69
  self::HtmlAttribute => [
71
- self::HtmlText => 'convertHtmlToHtmlAttr',
72
- ],
73
- self::HtmlAttribute . '/' . self::Url => [
74
- self::HtmlText => 'convertHtmlToHtmlAttr',
75
- self::HtmlAttribute => 'nop',
70
+ self::HtmlText => 'HtmlHelpers::convertAttrToHtml',
76
71
  ],
77
72
  ];
78
73
 
79
74
  private string $state = '';
80
- private string $tag = '';
81
75
  private string $subType = '';
82
76
 
83
77
 
84
78
  public function __construct(
85
79
  private string $contentType,
86
80
  ) {
87
- $this->state = in_array($contentType, [ContentType::Html, ContentType::Xml], true)
81
+ $this->state = in_array($contentType, [ContentType::Html, ContentType::Xml], strict: true)
88
82
  ? self::HtmlText
89
83
  : $contentType;
90
84
  }
@@ -118,18 +112,11 @@ final class Escaper
118
112
  {
119
113
  if ($el->isRawText()) {
120
114
  $this->state = self::HtmlRawText;
121
- $this->subType = self::Text;
122
115
  if ($el->is('script')) {
123
116
  $type = $el->getAttribute('type');
124
- if ($type === true || $type === null
125
- || is_string($type) && preg_match('#((application|text)/(((x-)?java|ecma|j|live)script|json)|application/.+\+json|text/plain|module|importmap|)$#Ai', $type)
126
- ) {
127
- $this->subType = self::JavaScript;
128
-
129
- } elseif (is_string($type) && preg_match('#text/((x-)?template|html)$#Ai', $type)) {
130
- $this->subType = self::HtmlText;
131
- }
132
-
117
+ $this->subType = $type === true || $type === null
118
+ ? self::JavaScript
119
+ : (is_string($type) ? HtmlHelpers::classifyScriptType($type) : '');
133
120
  } elseif ($el->is('style')) {
134
121
  $this->subType = self::Css;
135
122
  }
@@ -144,7 +131,6 @@ final class Escaper
144
131
  public function enterHtmlTag(string $name): void
145
132
  {
146
133
  $this->state = self::HtmlTag;
147
- $this->tag = strtolower($name);
148
134
  }
149
135
 
150
136
 
@@ -166,10 +152,6 @@ final class Escaper
166
152
  $this->subType = self::JavaScript;
167
153
  } elseif ($name === 'style') {
168
154
  $this->subType = self::Css;
169
- } elseif ((in_array($name, ['href', 'src', 'action', 'formaction'], true)
170
- || ($name === 'data' && $this->tag === 'object'))
171
- ) {
172
- $this->subType = self::Url;
173
155
  }
174
156
  }
175
157
  }
@@ -191,56 +173,55 @@ final class Escaper
191
173
  {
192
174
  return match ($this->contentType) {
193
175
  ContentType::Html => match ($this->state) {
194
- self::HtmlText => 'LR\Filters::escapeHtmlText(' . $str . ')',
195
- self::HtmlTag => 'LR\Filters::escapeHtmlTag(' . $str . ')',
176
+ self::HtmlText => 'LR\HtmlHelpers::escapeText(' . $str . ')',
177
+ self::HtmlTag => 'LR\HtmlHelpers::escapeTag(' . $str . ')',
196
178
  self::HtmlAttribute => match ($this->subType) {
197
- '',
198
- self::Url => 'LR\Filters::escapeHtmlAttr(' . $str . ')',
199
- self::JavaScript => 'LR\Filters::escapeHtmlAttr(LR\Filters::escapeJs(' . $str . '))',
200
- self::Css => 'LR\Filters::escapeHtmlAttr(LR\Filters::escapeCss(' . $str . '))',
179
+ '' => 'LR\HtmlHelpers::escapeAttr(' . $str . ')',
180
+ self::JavaScript => 'LR\HtmlHelpers::escapeAttr(LR\Helpers::escapeJs(' . $str . '))',
181
+ self::Css => 'LR\HtmlHelpers::escapeAttr(LR\Helpers::escapeCss(' . $str . '))',
201
182
  },
202
- self::HtmlComment => 'LR\Filters::escapeHtmlComment(' . $str . ')',
203
- self::HtmlBogusTag => 'LR\Filters::escapeHtml(' . $str . ')',
183
+ self::HtmlComment => 'LR\HtmlHelpers::escapeComment(' . $str . ')',
184
+ self::HtmlBogusTag => 'LR\HtmlHelpers::escapeTag(' . $str . ')',
204
185
  self::HtmlRawText => match ($this->subType) {
205
- self::Text => 'LR\Filters::convertJSToHtmlRawText(' . $str . ')', // sanitization, escaping is not possible
206
- self::HtmlText => 'LR\Filters::escapeHtmlRawTextHtml(' . $str . ')',
207
- self::JavaScript => 'LR\Filters::escapeJs(' . $str . ')',
208
- self::Css => 'LR\Filters::escapeCss(' . $str . ')',
186
+ self::Text => 'LR\HtmlHelpers::convertJSToRawText(' . $str . ')', // sanitization, escaping is not possible
187
+ self::HtmlText => 'LR\HtmlHelpers::escapeRawHtml(' . $str . ')',
188
+ self::JavaScript => 'LR\Helpers::escapeJs(' . $str . ')',
189
+ self::Css => 'LR\Helpers::escapeCss(' . $str . ')',
209
190
  },
210
191
  default => throw new \LogicException("Unknown context $this->contentType, $this->state."),
211
192
  },
212
193
  ContentType::Xml => match ($this->state) {
213
- self::HtmlText,
214
- self::HtmlBogusTag => 'LR\Filters::escapeXml(' . $str . ')',
215
- self::HtmlAttribute => 'LR\Filters::escapeXml(' . $str . ')',
216
- self::HtmlComment => 'LR\Filters::escapeHtmlComment(' . $str . ')',
217
- self::HtmlTag => 'LR\Filters::escapeXmlTag(' . $str . ')',
194
+ self::HtmlText => 'LR\XmlHelpers::escapeText(' . $str . ')',
195
+ self::HtmlBogusTag => 'LR\XmlHelpers::escapeTag(' . $str . ')',
196
+ self::HtmlAttribute => 'LR\XmlHelpers::escapeAttr(' . $str . ')',
197
+ self::HtmlComment => 'LR\HtmlHelpers::escapeComment(' . $str . ')',
198
+ self::HtmlTag => 'LR\XmlHelpers::escapeTag(' . $str . ')',
218
199
  default => throw new \LogicException("Unknown context $this->contentType, $this->state."),
219
200
  },
220
- ContentType::JavaScript => 'LR\Filters::escapeJs(' . $str . ')',
221
- ContentType::Css => 'LR\Filters::escapeCss(' . $str . ')',
222
- ContentType::ICal => 'LR\Filters::escapeIcal(' . $str . ')',
201
+ ContentType::JavaScript => 'LR\Helpers::escapeJs(' . $str . ')',
202
+ ContentType::Css => 'LR\Helpers::escapeCss(' . $str . ')',
203
+ ContentType::ICal => 'LR\Helpers::escapeIcal(' . $str . ')',
223
204
  ContentType::Text => '($this->filters->escape)(' . $str . ')',
224
205
  default => throw new \LogicException("Unknown content-type $this->contentType."),
225
206
  };
226
207
  }
227
208
 
228
209
 
229
- public function escapeMandatory(string $str): string
210
+ public function escapeMandatory(string $str, ?Position $position = null): string
230
211
  {
231
212
  return match ($this->contentType) {
232
213
  ContentType::Html => match ($this->state) {
233
- self::HtmlAttribute => "LR\\Filters::escapeHtmlQuotes($str)",
214
+ self::HtmlAttribute => "LR\\HtmlHelpers::escapeQuotes($str)",
234
215
  self::HtmlRawText => match ($this->subType) {
235
- self::HtmlText => 'LR\Filters::convertHtmlToHtmlRawText(' . $str . ')',
236
- default => "LR\\Filters::convertJSToHtmlRawText($str)",
216
+ self::HtmlText => 'LR\HtmlHelpers::convertHtmlToRawText(' . $str . ')',
217
+ default => "LR\\HtmlHelpers::convertJSToRawText($str)",
237
218
  },
238
- self::HtmlComment => 'LR\Filters::escapeHtmlComment(' . $str . ')',
219
+ self::HtmlComment => throw new Latte\CompileException('Using |noescape is not allowed in this context.', $position),
239
220
  default => $str,
240
221
  },
241
222
  ContentType::Xml => match ($this->state) {
242
- self::HtmlAttribute => "LR\\Filters::escapeHtmlQuotes($str)",
243
- self::HtmlComment => 'LR\Filters::escapeHtmlComment(' . $str . ')',
223
+ self::HtmlAttribute => "LR\\HtmlHelpers::escapeQuotes($str)",
224
+ self::HtmlComment => throw new Latte\CompileException('Using |noescape is not allowed in this context.', $position),
244
225
  default => $str,
245
226
  },
246
227
  default => $str,
@@ -248,20 +229,20 @@ final class Escaper
248
229
  }
249
230
 
250
231
 
251
- public function check(string $str): string
232
+ public function escapeContent(string $str): string
252
233
  {
253
- if ($this->state === self::HtmlAttribute && $this->subType === self::Url) {
254
- $str = 'LR\Filters::safeUrl(' . $str . ')';
255
- }
256
- return $str;
234
+ return 'LR\Helpers::convertTo($ʟ_fi, '
235
+ . var_export($this->export(), return: true) . ', '
236
+ . $str
237
+ . ')';
257
238
  }
258
239
 
259
240
 
260
241
  public static function getConvertor(string $source, string $dest): ?callable
261
242
  {
262
243
  return match (true) {
263
- $source === $dest => [Filters::class, 'nop'],
264
- isset(self::Convertors[$source][$dest]) => [Filters::class, self::Convertors[$source][$dest]],
244
+ $source === $dest => Helpers::nop(...),
245
+ isset(self::Convertors[$source][$dest]) => 'Latte\Runtime\\' . self::Convertors[$source][$dest],
265
246
  default => null,
266
247
  };
267
248
  }
@@ -1,11 +1,14 @@
1
- <?php
2
-
3
- declare(strict_types=1);
1
+ <?php declare(strict_types=1);
4
2
 
5
3
  namespace Latte\Compiler;
6
4
 
7
5
 
8
6
  /**
7
+ * Base class for AST nodes representing parsed template structure.
8
+ *
9
+ * Each node must implement print() to generate PHP code and getIterator()
10
+ * to yield child nodes for compiler passes.
11
+ *
9
12
  * @implements \IteratorAggregate<Node>
10
13
  */
11
14
  abstract class Node implements \IteratorAggregate
@@ -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;
11
9
 
12
10
  use Latte\Compiler\Nodes\Php;
13
11
  use Latte\Compiler\Nodes\Php\Expression;
14
12
  use Latte\Compiler\Nodes\Php\ExpressionNode;
15
13
  use Latte\Compiler\Nodes\Php\Scalar;
14
+ use function array_merge, constant, defined;
16
15
 
17
16
 
17
+ /**
18
+ * Utility functions for working with AST nodes.
19
+ */
18
20
  final class NodeHelpers
19
21
  {
20
- /** @return Node[] */
22
+ /**
23
+ * @param callable(Node): bool $filter
24
+ * @return Node[]
25
+ */
21
26
  public static function find(Node $node, callable $filter): array
22
27
  {
23
28
  $found = [];
@@ -31,6 +36,7 @@ final class NodeHelpers
31
36
  }
32
37
 
33
38
 
39
+ /** @param callable(Node): bool $filter */
34
40
  public static function findFirst(Node $node, callable $filter): ?Node
35
41
  {
36
42
  $found = null;
@@ -48,7 +54,7 @@ final class NodeHelpers
48
54
  public static function clone(Node $node): Node
49
55
  {
50
56
  return (new NodeTraverser)
51
- ->traverse($node, enter: fn(Node $node) => clone $node);
57
+ ->traverse($node, enter: fn(Node $node) => clone $node) ?? throw new \LogicException;
52
58
  }
53
59
 
54
60
 
@@ -90,7 +96,11 @@ final class NodeHelpers
90
96
  ? constant($name)
91
97
  : throw new \InvalidArgumentException("The constant '$name' is not defined.");
92
98
 
93
- } elseif ($node instanceof Expression\ClassConstantFetchNode && $constants) {
99
+ } elseif (
100
+ $node instanceof Expression\ClassConstantFetchNode
101
+ && $constants
102
+ && $node->name instanceof Php\IdentifierNode
103
+ ) {
94
104
  $class = $node->class instanceof Php\NameNode
95
105
  ? $node->class->toCodeString()
96
106
  : self::toValue($node->class, $constants);
@@ -1,39 +1,45 @@
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;
11
9
 
12
10
 
11
+ /**
12
+ * Traverses and transforms AST nodes using visitor pattern.
13
+ */
13
14
  final class NodeTraverser
14
15
  {
15
16
  public const DontTraverseChildren = 1;
16
17
  public const StopTraversal = 2;
18
+ public const RemoveNode = 3;
17
19
 
18
- /** @var ?callable(Node): (Node|int|null) */
19
- private $enter;
20
+ /** @var ?(\Closure(Node): (Node|int|void|null)) */
21
+ private ?\Closure $enter = null;
20
22
 
21
- /** @var ?callable(Node): (Node|int|null) */
22
- private $leave;
23
+ /** @var ?(\Closure(Node): (Node|int|void|null)) */
24
+ private ?\Closure $leave = null;
23
25
 
24
26
  private bool $stop;
25
27
 
26
28
 
27
- public function traverse(Node $node, ?callable $enter = null, ?callable $leave = null): Node
29
+ /**
30
+ * @param ?(callable(Node): (Node|int|void|null)) $enter
31
+ * @param ?(callable(Node): (Node|int|void|null)) $leave
32
+ */
33
+ public function traverse(Node $node, ?callable $enter = null, ?callable $leave = null): ?Node
28
34
  {
29
- $this->enter = $enter;
30
- $this->leave = $leave;
35
+ $this->enter = $enter ? $enter(...) : null;
36
+ $this->leave = $leave ? $leave(...) : null;
31
37
  $this->stop = false;
32
38
  return $this->traverseNode($node);
33
39
  }
34
40
 
35
41
 
36
- private function traverseNode(Node $node): Node
42
+ private function traverseNode(Node $node): ?Node
37
43
  {
38
44
  $children = true;
39
45
  if ($this->enter) {
@@ -46,7 +52,10 @@ final class NodeTraverser
46
52
 
47
53
  } elseif ($res === self::StopTraversal) {
48
54
  $this->stop = true;
49
- $children = false;
55
+ return $node;
56
+
57
+ } elseif ($res === self::RemoveNode) {
58
+ return null;
50
59
  }
51
60
  }
52
61
 
@@ -63,8 +72,12 @@ final class NodeTraverser
63
72
  $res = ($this->leave)($node);
64
73
  if ($res instanceof Node) {
65
74
  $node = $res;
75
+
66
76
  } elseif ($res === self::StopTraversal) {
67
77
  $this->stop = true;
78
+
79
+ } elseif ($res === self::RemoveNode) {
80
+ return null;
68
81
  }
69
82
  }
70
83
 
@@ -1,17 +1,21 @@
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\Node;
13
11
 
14
12
 
13
+ /**
14
+ * Base for nodes representing template content that produces output.
15
+ *
16
+ * Includes text, HTML elements, and Latte tags. Extend StatementNode
17
+ * for custom Latte tags, or AreaNode directly for passive content.
18
+ */
15
19
  abstract class AreaNode extends Node
16
20
  {
17
21
  }
@@ -1,22 +1,23 @@
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\Node;
13
11
  use Latte\Compiler\PrintContext;
14
12
 
15
13
 
14
+ /**
15
+ * Code generator hidden from compiler passes. Pass child nodes for traversal.
16
+ */
16
17
  class AuxiliaryNode extends AreaNode
17
18
  {
18
19
  public function __construct(
19
- public /*readonly*/ \Closure $print,
20
+ public readonly \Closure $print,
20
21
  /** @var (?Node)[] */
21
22
  public array $nodes = [],
22
23
  ) {
@@ -1,24 +1,27 @@
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;
11
+ use Latte\Helpers;
12
+ use function array_merge, count;
13
13
 
14
14
 
15
+ /**
16
+ * Container for sequence of child nodes.
17
+ */
15
18
  final class FragmentNode extends AreaNode
16
19
  {
17
20
  /** @var AreaNode[] */
18
21
  public array $children = [];
19
22
 
20
23
 
21
- /** @param AreaNode[] $children */
24
+ /** @param AreaNode[] $children */
22
25
  public function __construct(array $children = [])
23
26
  {
24
27
  foreach ($children as $child) {
@@ -65,5 +68,6 @@ final class FragmentNode extends AreaNode
65
68
  foreach ($this->children as &$item) {
66
69
  yield $item;
67
70
  }
71
+ Helpers::removeNulls($this->children);
68
72
  }
69
73
  }
@@ -1,22 +1,22 @@
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\NodeHelpers;
13
11
  use Latte\Compiler\Nodes\AreaNode;
14
- use Latte\Compiler\Nodes\FragmentNode;
15
12
  use Latte\Compiler\Nodes\TextNode;
16
13
  use Latte\Compiler\Position;
17
14
  use Latte\Compiler\PrintContext;
18
15
 
19
16
 
17
+ /**
18
+ * HTML attribute with name, optional value, and quote style.
19
+ */
20
20
  class AttributeNode extends AreaNode
21
21
  {
22
22
  public function __construct(
@@ -37,21 +37,13 @@ class AttributeNode extends AreaNode
37
37
 
38
38
  $res .= "echo '=';";
39
39
  $quote = $this->quote ?? ($this->value instanceof TextNode ? null : '"');
40
- $res .= $quote ? 'echo ' . var_export($quote, true) . ';' : '';
40
+ $res .= $quote ? 'echo ' . var_export($quote, return: true) . ';' : '';
41
41
 
42
42
  $escaper = $context->beginEscape();
43
43
  $escaper->enterHtmlAttribute(NodeHelpers::toText($this->name));
44
- if ($this->value instanceof FragmentNode && $escaper->export() === 'html/attr/url') {
45
- foreach ($this->value->children as $child) {
46
- $res .= $child->print($context);
47
- $escaper->enterHtmlAttribute(null);
48
- }
49
- } else {
50
- $res .= $this->value->print($context);
51
- }
52
-
44
+ $res .= $this->value->print($context);
53
45
  $context->restoreEscape();
54
- $res .= $quote ? 'echo ' . var_export($quote, true) . ';' : '';
46
+ $res .= $quote ? 'echo ' . var_export($quote, return: true) . ';' : '';
55
47
  return $res;
56
48
  }
57
49
 
@@ -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\Html;
11
9
 
12
10
  use Latte\Compiler\Nodes\AreaNode;
@@ -15,7 +13,7 @@ use Latte\Compiler\PrintContext;
15
13
 
16
14
 
17
15
  /**
18
- * HTML bogus tag.
16
+ * DOCTYPE or bogus HTML tags.
19
17
  */
20
18
  class BogusTagNode extends AreaNode
21
19
  {
@@ -30,11 +28,11 @@ class BogusTagNode extends AreaNode
30
28
 
31
29
  public function print(PrintContext $context): string
32
30
  {
33
- $res = 'echo ' . var_export($this->openDelimiter, true) . ';';
31
+ $res = 'echo ' . var_export($this->openDelimiter, return: true) . ';';
34
32
  $context->beginEscape()->enterHtmlBogusTag();
35
33
  $res .= $this->content->print($context);
36
34
  $context->restoreEscape();
37
- $res .= 'echo ' . var_export($this->endDelimiter, true) . ';';
35
+ $res .= 'echo ' . var_export($this->endDelimiter, return: true) . ';';
38
36
  return $res;
39
37
  }
40
38
 
@@ -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\Html;
11
9
 
12
10
  use Latte\Compiler\Nodes\AreaNode;
@@ -14,6 +12,9 @@ use Latte\Compiler\Position;
14
12
  use Latte\Compiler\PrintContext;
15
13
 
16
14
 
15
+ /**
16
+ * HTML comment (<!-- ... -->).
17
+ */
17
18
  class CommentNode extends AreaNode
18
19
  {
19
20
  public function __construct(