conditional_functions.php
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:12k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. // +-------------------------------------------------------------+
  3. // | DeskPRO v [2.0.1 Production]
  4. // | Copyright (C) 2001 - 2004 Headstart Solutions Limited
  5. // | Supplied by WTN-WDYL
  6. // | Nullified by WTN-WDYL
  7. // | Distribution via WebForum, ForumRU and associated file dumps
  8. // +-------------------------------------------------------------+
  9. // | DESKPRO IS NOT FREE SOFTWARE
  10. // +-------------------------------------------------------------+
  11. // | License ID : Full Enterprise License =) ...
  12. // | License Owner : WTN-WDYL Team
  13. // +-------------------------------------------------------------+
  14. // | $RCSfile: conditional_functions.php,v $
  15. // | $Date: 2004/02/10 01:34:25 $
  16. // | $Revision: 1.16 $
  17. // +-------------------------------------------------------------+
  18. // | File Details:
  19. // | - Utility functions for template engine
  20. // +-------------------------------------------------------------+
  21. error_reporting(E_ALL ^ E_NOTICE);
  22. ##########################################################
  23. #
  24. # function format_text_item: return formatted string 
  25. # without leading spaces and with slashes
  26. # for example: $in = " test''test  "
  27. # function return: "test''test"
  28. #
  29. function format_text_item($in)
  30. {
  31. // $in = trim($in);
  32. if ((substr($in, 0, 2) == "rn")) {
  33. $in = substr($in, 2);
  34. }
  35. $in = addslashes($in);
  36. return ""$in"";
  37. }
  38. ##########################################################
  39. #
  40. # recursive function tree_to_tertiary_operator: return 
  41. # tertiary operator string, which was built from tree
  42. #
  43. function tree_to_tertiary_operator(& $node)
  44. {
  45. $out = '';
  46. $dataref = $node['data'];
  47. $node_items = array();
  48. for ($i = 0; $i < count($node['data']); $i++)
  49. {
  50. $data_item = & $node['data'][$i];
  51. if (is_array($data_item))
  52. {
  53.   $if_block = '(('.$data_item['if']['conditional'].') ? (';
  54. $if_data = tree_to_tertiary_operator($data_item['if']);
  55. $if_block .= $if_data.') : ';
  56. if (!is_array($data_item['elseif']) && !is_array($data_item['else']))
  57. {
  58. $if_block .= "''";
  59. }
  60. elseif (!is_array($data_item['elseif']) && is_array($data_item['else']))
  61. {
  62. $else_block = tree_to_tertiary_operator($data_item['else']);
  63. $if_block .= "($else_block)";
  64. }
  65. else
  66. {
  67. $elif_block = elsif_array_to_tertiary_operator($data_item['elseif'],
  68. $data_item['else']);
  69. $if_block .= "($elif_block)";
  70. }
  71. array_push ($node_items, $if_block.')');
  72. }
  73. else
  74. {
  75. array_push ($node_items, format_text_item($data_item));
  76. }
  77. }
  78. $out .= join('.', $node_items);
  79. // changed
  80. if (empty($out)) {
  81. $out = '""';
  82. }
  83. return $out;
  84. }
  85. #################################################################
  86. #
  87. # function elsif_array_to_tertiary_operator: return
  88. # tertiary operator string, which was built from tree for 
  89. # elseif operator
  90. #
  91. #
  92. function elsif_array_to_tertiary_operator (& $elsif_array, & $else_hash)
  93. {
  94. $out = '(';
  95. $elsif_hash = array_shift($elsif_array);
  96. $out .= "(".$elsif_hash['conditional'].") ? (";
  97. $out .= tree_to_tertiary_operator($elsif_hash);
  98. $out .= ") : ";
  99. if (count($elsif_array) > 0)
  100. {
  101. $out .= elsif_array_to_tertiary_operator($elsif_array, $else_hash);
  102. }
  103. elseif (is_array($else_hash))
  104. {
  105. $out .= "(";
  106. $out .= tree_to_tertiary_operator($else_hash);
  107. $out .= ")";
  108. }
  109. else
  110. {
  111. $out .= """";
  112. }
  113. $out .= ")";
  114. return $out;
  115. }
  116. ##############################################################
  117. #
  118. # recursive function lex_queue_to_tree: return
  119. # tree. This function check also syntax for all lexemes
  120. #
  121. #
  122. function lex_queue_to_tree(& $root_node,& $lex_queue, $level_deep)
  123. {
  124. $ignore_level_up = 0;
  125. do
  126. {
  127. $next_item = array_shift($lex_queue);
  128. if ($next_item['type'] == 'text')
  129. {
  130. array_push ($root_node['data'], $next_item['value']);
  131. }
  132. elseif ($next_item['type'] == 'if')
  133. {
  134. $conditional = array_shift($lex_queue);
  135. if(!($conditional['type'] == 'conditional' && $conditional['value'] != ""))
  136. {
  137. die ("If requires conditional statement");
  138. }
  139. $new_check_node['if']['parent'] = & $new_check_node;
  140. array_push ($root_node['data'], array(
  141. 'if' => array(
  142. 'conditional' => $conditional['value'],
  143.   'data' => array()
  144. )
  145. ));
  146. $ignore_level_up = 
  147. lex_queue_to_tree($root_node['data'][count($root_node['data']) - 1]['if'],
  148.  $lex_queue, $level_deep + 1);
  149. }
  150. elseif ($next_item['type'] == 'elseif')
  151. {
  152. if ($ignore_level_up > 0) 
  153. $ignore_level_up = 0;
  154. else
  155. {
  156. array_unshift($lex_queue, $next_item);
  157. return 1;
  158. }
  159. $conditional = array_shift($lex_queue);
  160. if(!($conditional['type'] == 'conditional' && $conditional['value']!=""))
  161. {
  162. die ("ElseIf requires conditional statement");
  163. }
  164. if(!(is_array($root_node['data'][count($root_node['data']) - 1])))
  165. {
  166. die ("ElseIf requires preceeding If");
  167. }
  168. if (!is_array($root_node['data'][count($root_node['data']) - 1]['elseif']))
  169. {
  170. $root_node['data'][count($root_node['data']) - 1]['elseif'] = array();
  171. }
  172. array_push($root_node['data'][count($root_node['data']) - 1]['elseif'], array(
  173. 'conditional' => $conditional['value'],
  174. 'data' => array()
  175. ));
  176. $ignore_level_up = 
  177. lex_queue_to_tree($root_node['data'][count($root_node['data']) - 1]['elseif']
  178. [count($root_node['data'][count($root_node['data']) - 1]['elseif']) - 1],
  179.  $lex_queue, $level_deep + 1);
  180. }
  181. elseif ($next_item['type'] == 'else')
  182. {
  183. if ($ignore_level_up > 0) 
  184. $ignore_level_up = 0;
  185. else
  186. {
  187. array_unshift($lex_queue, $next_item);
  188. return 1;
  189. }
  190. if(!(is_array($root_node['data'][count($root_node['data']) - 1])))
  191. {
  192. die ("Else requires preceeding If");
  193. }
  194. if (defined($root_node['data'][count($root_node['data']) - 1]['else']))
  195. {
  196. die ("Else already defined for If");
  197. }
  198. $root_node['data'][count($root_node['data']) - 1]['else'] 
  199. = array( 'data' => array() );
  200. lex_queue_to_tree($root_node['data'][count($root_node['data']) - 1]['else'],
  201.  $lex_queue, $level_deep + 1);
  202. }
  203. elseif ($next_item['type'] == 'endif')
  204. {
  205. if(!$level_deep)
  206. {
  207. die ("EndIf requires preceeding If");
  208. }
  209. return 0;
  210. }
  211. elseif ($next_item['type'] == 'conditional')
  212. {
  213. die ("Unexpected conditional statement, probably bug in parsern");
  214. }
  215. } while (count($lex_queue) > 0);
  216. if ($level_deep)
  217. {
  218. die("No enough EndIf'sn");
  219. }
  220. return 0;
  221. }
  222. #######################################################################
  223. #
  224. # function text_to_lexemes_queue: return hash, which contain 
  225. # queue with lexemes from template
  226. #
  227. #
  228. function text_to_lexemes_queue($text)
  229. {
  230. #list ($parse_conditional, $consume_chars) = (0, 0);
  231. $parse_conditional = 0;
  232. $consume_chars = 0;
  233. $out = array();
  234. do
  235. {
  236. $parse_conditional = 0;
  237. if (preg_match("/^(<%elseifs+)/s", $text, $matches))
  238. {
  239. $consume_chars = strlen($matches[1]);
  240. array_push($out, array( 'type' => 'elseif' ));
  241. $parse_conditional = 1;
  242. }
  243. elseif (preg_match("/^(<%else%>)/s",$text,$matches))
  244. {
  245. $consume_chars = strlen($matches[1]);
  246. array_push($out, array( 'type' => 'else' ));
  247. }
  248. elseif (preg_match("/^(<%endif%>)/s",$text, $matches))
  249. {
  250. $consume_chars = strlen($matches[1]);
  251. array_push($out, array( 'type' => 'endif' ));
  252. }
  253. elseif (preg_match("/^(<%ifs+)/s", $text,$matches))
  254. {
  255. $consume_chars = strlen($matches[1]);
  256. array_push($out, array( 'type' => 'if' ));
  257. $parse_conditional = 1;
  258. }
  259. elseif (preg_match("/^(.)/s", $text, $matches))
  260. {
  261. $consume_chars = 1;
  262. $textchar = $matches[1];
  263.             if ($out[count($out)-1]['type'] == 'text')
  264.             {
  265.                 $out[count($out)-1]['value'] .= $textchar;
  266.             }
  267. else
  268. {
  269. array_push($out, array('type' => 'text', 'value' => $textchar ));
  270. }
  271. }
  272. $text = substr($text, $consume_chars);
  273. if ($parse_conditional)
  274. {
  275. array_push ($out, array('type' => 'conditional', 'value' => read_conditional($text)));
  276. }
  277. } while (strlen ($text));
  278. return $out;
  279. }
  280. ################################################################################
  281. #
  282. # function read_conditional: become reference to conditional in
  283. # if or elseif statements.
  284. #
  285. #
  286. function read_conditional(& $textref)
  287. {
  288. $out='';
  289. $consume_chars=0;
  290. $exit=0;
  291. $parse_quoted=0;
  292. $quote_char=0;
  293. do
  294. {
  295. $parse_quoted = 0;
  296. if ((preg_match("/^(')/", $textref,$matches)) || (preg_match("/^(")/",$textref,$matches)))
  297. {
  298. $quote_char = $matches[1];
  299. $out .= $quote_char;
  300. $consume_chars = 1;
  301. $parse_quoted = 1;
  302. }
  303. elseif (preg_match("/^(%>)/",$textref))
  304. {
  305. $consume_chars = 2;
  306. $exit = 1;
  307. }
  308. elseif (preg_match("/^(.)/s", $textref, $matches))
  309. {
  310. $out .= $matches[1];
  311. $consume_chars = 1;
  312. }
  313. elseif (!strlen($textref))
  314. {
  315. die ("Unexpected end of text while reading PHP conditional statement");
  316. }
  317. $textref = substr($textref, $consume_chars);
  318. if ($parse_quoted)
  319. {
  320. $out .= read_quoted($textref, $quote_char);
  321. }
  322. } while (! $exit);
  323. # (PHP syntax) check out with eval
  324. return $out;
  325. }
  326. ####################################################################
  327. #
  328. # function read_quoted: function for testing quoted text
  329. #
  330. #
  331. function read_quoted (& $textref, $quote_char)
  332. {
  333. $regexp_quote = AddSlashes($quote_char);
  334. $out = '';
  335. $consume_chars = 0;
  336. $exit_quote = 0;
  337. do
  338. {
  339. if ((preg_match("/^\$regexp_quote/",$textref)) || (preg_match("/^\\/", $textref)))
  340. {
  341. $consume_chars = 2;
  342. }
  343. elseif (preg_match("/^$regexp_quote/", $textref))
  344. {
  345. $consume_chars = 1;
  346. $exit_quote = 1;
  347. }
  348. elseif (preg_match("/^(.)/s", $textref))
  349. {
  350. $consume_chars = 1;
  351. }
  352. elseif (!strlen($textref))
  353. {
  354. die ("Unexpected end of text while reading quoted string");
  355. }
  356. $out .= substr($textref, 0, $consume_chars);
  357. $textref = substr($textref, $consume_chars);
  358. } while (! $exit_quote);
  359. return $out;
  360. }
  361. /****************************************************
  362. function parse_conditionals()
  363. -----DESCRIPTION: -----------------------------------
  364. Parse an unparsed template through the lexical parser
  365. to produce an eval-ready template object.
  366. -----ARGUMENTS: -------------------------------------
  367. template Template to parse
  368. -----RETURNS: ---------------------------------------
  369. The parsed template.
  370. ****************************************************/
  371. function parse_conditionals($template) {
  372. $template = preg_replace("#s?<%!--.*--!%>s?#", '', $template);
  373. if ($GLOBALS['session_url']) {
  374. $template = preg_replace('#.php(?)?#ies', ''.php{$GLOBALS[session_url]}'.(('1' != '') ? ('{$GLOBALS[session_ampersand]}') : (''))', $template);
  375. }
  376. $lex_queue = text_to_lexemes_queue($template);
  377. $root = array('data' => array());
  378. if (lex_queue_to_tree($root, $lex_queue, 0)) {
  379. die ("Else already defined or ElseIf without Ifn");
  380. }
  381. $output = tree_to_tertiary_operator($root);
  382. $output = get_loops($output);
  383. return $output;
  384. }
  385. /****************************************************
  386. function get_loops()
  387. -----DESCRIPTION: -----------------------------------
  388. Replace <%loop%> occurences with callable code
  389. reference.
  390. -----ARGUMENTS: -------------------------------------
  391. template Template to process
  392. -----RETURNS: ---------------------------------------
  393. The processed template.
  394. ****************************************************/
  395. function get_loops ($template) {
  396. $template = preg_replace('#<%loop ($[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*) ?%>(.*)<%endloop%>#iUse', "loop_code('\1', '\2')",$template);
  397. return $template;
  398. }
  399. /****************************************************
  400. function loop_code()
  401. -----DESCRIPTION: -----------------------------------
  402. Perform loop calls for every loop in a template
  403. -----ARGUMENTS: -------------------------------------
  404. loop_name Name of the element being looped
  405. loop_code Code to execute during each iteration
  406. -----RETURNS: ---------------------------------------
  407. Code fragment to execute the loop
  408. ****************************************************/
  409. function loop_code($loop_name, $loop_code) {
  410. $loop_name = stripslashes($loop_name);
  411. $loop_code = stripslashes($loop_code);
  412. $loop_name2 = substr($loop_name, 1);
  413. $loop_code = str_replace("'", "loop-temp-section", $loop_code);
  414. return " " . doloop('$loop_name2', $loop_name, '$loop_code', $GLOBALS) . "";
  415. }
  416. ?>