PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/tools/smarty/sysplugins/smarty_internal_parsetree.php

https://gitlab.com/staging06/myproject
PHP | 394 lines | 183 code | 27 blank | 184 comment | 43 complexity | 7ef0c18f9bb71f5bad799d7428eaebf9 MD5 | raw file
  1. <?php
  2. /**
  3. * Smarty Internal Plugin Templateparser Parsetrees
  4. * These are classes to build parsetrees in the template parser
  5. *
  6. * @package Smarty
  7. * @subpackage Compiler
  8. * @author Thue Kristensen
  9. * @author Uwe Tews
  10. */
  11. /**
  12. * @package Smarty
  13. * @subpackage Compiler
  14. * @ignore
  15. */
  16. abstract class _smarty_parsetree
  17. {
  18. /**
  19. * Parser object
  20. *
  21. * @var object
  22. */
  23. public $parser;
  24. /**
  25. * Buffer content
  26. *
  27. * @var mixed
  28. */
  29. public $data;
  30. /**
  31. * Subtree array
  32. *
  33. * @var array
  34. */
  35. public $subtrees = array();
  36. /**
  37. * Return buffer
  38. *
  39. * @return string buffer content
  40. */
  41. abstract public function to_smarty_php();
  42. }
  43. /**
  44. * A complete smarty tag.
  45. *
  46. * @package Smarty
  47. * @subpackage Compiler
  48. * @ignore
  49. */
  50. class _smarty_tag extends _smarty_parsetree
  51. {
  52. /**
  53. * Saved block nesting level
  54. *
  55. * @var int
  56. */
  57. public $saved_block_nesting;
  58. /**
  59. * Create parse tree buffer for Smarty tag
  60. *
  61. * @param object $parser parser object
  62. * @param string $data content
  63. */
  64. public function __construct($parser, $data)
  65. {
  66. $this->parser = $parser;
  67. $this->data = $data;
  68. $this->saved_block_nesting = $parser->block_nesting_level;
  69. }
  70. /**
  71. * Return buffer content
  72. *
  73. * @return string content
  74. */
  75. public function to_smarty_php()
  76. {
  77. return $this->data;
  78. }
  79. /**
  80. * Return complied code that loads the evaluated output of buffer content into a temporary variable
  81. *
  82. * @return string template code
  83. */
  84. public function assign_to_var()
  85. {
  86. $var = sprintf('$_tmp%d', ++Smarty_Internal_Templateparser::$prefix_number);
  87. $this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>', $this->data, $var);
  88. return $var;
  89. }
  90. }
  91. /**
  92. * Code fragment inside a tag.
  93. *
  94. * @package Smarty
  95. * @subpackage Compiler
  96. * @ignore
  97. */
  98. class _smarty_code extends _smarty_parsetree
  99. {
  100. /**
  101. * Create parse tree buffer for code fragment
  102. *
  103. * @param object $parser parser object
  104. * @param string $data content
  105. */
  106. public function __construct($parser, $data)
  107. {
  108. $this->parser = $parser;
  109. $this->data = $data;
  110. }
  111. /**
  112. * Return buffer content in parentheses
  113. *
  114. * @return string content
  115. */
  116. public function to_smarty_php()
  117. {
  118. return sprintf("(%s)", $this->data);
  119. }
  120. }
  121. /**
  122. * Double quoted string inside a tag.
  123. *
  124. * @package Smarty
  125. * @subpackage Compiler
  126. * @ignore
  127. */
  128. class _smarty_doublequoted extends _smarty_parsetree
  129. {
  130. /**
  131. * Create parse tree buffer for double quoted string subtrees
  132. *
  133. * @param object $parser parser object
  134. * @param _smarty_parsetree $subtree parsetree buffer
  135. */
  136. public function __construct($parser, _smarty_parsetree $subtree)
  137. {
  138. $this->parser = $parser;
  139. $this->subtrees[] = $subtree;
  140. if ($subtree instanceof _smarty_tag) {
  141. $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
  142. }
  143. }
  144. /**
  145. * Append buffer to subtree
  146. *
  147. * @param _smarty_parsetree $subtree parsetree buffer
  148. */
  149. public function append_subtree(_smarty_parsetree $subtree)
  150. {
  151. $last_subtree = count($this->subtrees) - 1;
  152. if ($last_subtree >= 0 && $this->subtrees[$last_subtree] instanceof _smarty_tag && $this->subtrees[$last_subtree]->saved_block_nesting < $this->parser->block_nesting_level) {
  153. if ($subtree instanceof _smarty_code) {
  154. $this->subtrees[$last_subtree]->data .= '<?php echo ' . $subtree->data . ';?>';
  155. } elseif ($subtree instanceof _smarty_dq_content) {
  156. $this->subtrees[$last_subtree]->data .= '<?php echo "' . $subtree->data . '";?>';
  157. } else {
  158. $this->subtrees[$last_subtree]->data .= $subtree->data;
  159. }
  160. } else {
  161. $this->subtrees[] = $subtree;
  162. }
  163. if ($subtree instanceof _smarty_tag) {
  164. $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
  165. }
  166. }
  167. /**
  168. * Merge subtree buffer content together
  169. *
  170. * @return string compiled template code
  171. */
  172. public function to_smarty_php()
  173. {
  174. $code = '';
  175. foreach ($this->subtrees as $subtree) {
  176. if ($code !== "") {
  177. $code .= ".";
  178. }
  179. if ($subtree instanceof _smarty_tag) {
  180. $more_php = $subtree->assign_to_var();
  181. } else {
  182. $more_php = $subtree->to_smarty_php();
  183. }
  184. $code .= $more_php;
  185. if (!$subtree instanceof _smarty_dq_content) {
  186. $this->parser->compiler->has_variable_string = true;
  187. }
  188. }
  189. return $code;
  190. }
  191. }
  192. /**
  193. * Raw chars as part of a double quoted string.
  194. *
  195. * @package Smarty
  196. * @subpackage Compiler
  197. * @ignore
  198. */
  199. class _smarty_dq_content extends _smarty_parsetree
  200. {
  201. /**
  202. * Create parse tree buffer with string content
  203. *
  204. * @param object $parser parser object
  205. * @param string $data string section
  206. */
  207. public function __construct($parser, $data)
  208. {
  209. $this->parser = $parser;
  210. $this->data = $data;
  211. }
  212. /**
  213. * Return content as double quoted string
  214. *
  215. * @return string doubled quoted string
  216. */
  217. public function to_smarty_php()
  218. {
  219. return '"' . $this->data . '"';
  220. }
  221. }
  222. /**
  223. * Template element
  224. *
  225. * @package Smarty
  226. * @subpackage Compiler
  227. * @ignore
  228. */
  229. class _smarty_template_buffer extends _smarty_parsetree
  230. {
  231. /**
  232. * Array of template elements
  233. *
  234. * @var array
  235. */
  236. public $subtrees = array();
  237. /**
  238. * Create root of parse tree for template elements
  239. *
  240. * @param object $parser parse object
  241. */
  242. public function __construct($parser)
  243. {
  244. $this->parser = $parser;
  245. }
  246. /**
  247. * Append buffer to subtree
  248. *
  249. * @param _smarty_parsetree $subtree
  250. */
  251. public function append_subtree(_smarty_parsetree $subtree)
  252. {
  253. $this->subtrees[] = $subtree;
  254. }
  255. /**
  256. * Sanitize and merge subtree buffers together
  257. *
  258. * @return string template code content
  259. */
  260. public function to_smarty_php()
  261. {
  262. $code = '';
  263. for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key ++) {
  264. if ($key + 2 < $cnt) {
  265. if ($this->subtrees[$key] instanceof _smarty_linebreak && $this->subtrees[$key + 1] instanceof _smarty_tag && $this->subtrees[$key + 1]->data == '' && $this->subtrees[$key + 2] instanceof _smarty_linebreak) {
  266. $key = $key + 1;
  267. continue;
  268. }
  269. if (substr($this->subtrees[$key]->data, - 1) == '<' && $this->subtrees[$key + 1]->data == '' && substr($this->subtrees[$key + 2]->data, - 1) == '?') {
  270. $key = $key + 2;
  271. continue;
  272. }
  273. }
  274. if (substr($code, - 1) == '<') {
  275. $subtree = $this->subtrees[$key]->to_smarty_php();
  276. if (substr($subtree, 0, 1) == '?') {
  277. $code = substr($code, 0, strlen($code) - 1) . '<<?php ?>?' . substr($subtree, 1);
  278. } elseif ($this->parser->asp_tags && substr($subtree, 0, 1) == '%') {
  279. $code = substr($code, 0, strlen($code) - 1) . '<<?php ?>%' . substr($subtree, 1);
  280. } else {
  281. $code .= $subtree;
  282. }
  283. continue;
  284. }
  285. if ($this->parser->asp_tags && substr($code, - 1) == '%') {
  286. $subtree = $this->subtrees[$key]->to_smarty_php();
  287. if (substr($subtree, 0, 1) == '>') {
  288. $code = substr($code, 0, strlen($code) - 1) . '%<?php ?>>' . substr($subtree, 1);
  289. } else {
  290. $code .= $subtree;
  291. }
  292. continue;
  293. }
  294. if (substr($code, - 1) == '?') {
  295. $subtree = $this->subtrees[$key]->to_smarty_php();
  296. if (substr($subtree, 0, 1) == '>') {
  297. $code = substr($code, 0, strlen($code) - 1) . '?<?php ?>>' . substr($subtree, 1);
  298. } else {
  299. $code .= $subtree;
  300. }
  301. continue;
  302. }
  303. $code .= $this->subtrees[$key]->to_smarty_php();
  304. }
  305. return $code;
  306. }
  307. }
  308. /**
  309. * template text
  310. *
  311. * @package Smarty
  312. * @subpackage Compiler
  313. * @ignore
  314. */
  315. class _smarty_text extends _smarty_parsetree
  316. {
  317. /**
  318. * Create template text buffer
  319. *
  320. * @param object $parser parser object
  321. * @param string $data text
  322. */
  323. public function __construct($parser, $data)
  324. {
  325. $this->parser = $parser;
  326. $this->data = $data;
  327. }
  328. /**
  329. * Return buffer content
  330. *
  331. * @return strint text
  332. */
  333. public function to_smarty_php()
  334. {
  335. return $this->data;
  336. }
  337. }
  338. /**
  339. * template linebreaks
  340. *
  341. * @package Smarty
  342. * @subpackage Compiler
  343. * @ignore
  344. */
  345. class _smarty_linebreak extends _smarty_parsetree
  346. {
  347. /**
  348. * Create buffer with linebreak content
  349. *
  350. * @param object $parser parser object
  351. * @param string $data linebreak string
  352. */
  353. public function __construct($parser, $data)
  354. {
  355. $this->parser = $parser;
  356. $this->data = $data;
  357. }
  358. /**
  359. * Return linebrak
  360. *
  361. * @return string linebreak
  362. */
  363. public function to_smarty_php()
  364. {
  365. return $this->data;
  366. }
  367. }