📄 functions.php
字号:
$template = gettemplate($templatename, $comments); if ($varname == 'echo') { $template = preg_replace('#<%PHP%>(.+)<%ENDPHP%>#ise', "'\";\nob_start();\n'.stripslashes(stripslashes('\\1')).'\n\$__output = ob_get_contents();\nob_end_clean();\necho \$__output.\"'", $template); // echo $template; return 'echo '.$template.'; '; } else { $template = preg_replace('#<%PHP%>(.+)<%ENDPHP%>#ise', "'\";\nob_start();\n'.stripslashes('\\1').'\n\$$varname .= ob_get_contents();\nob_end_clean();\n\$$varname .= \"'", $template); return '$'.$varname.' = '.$template.';'; }}############################################################ function format_text_item: return formatted string # without leading spaces and with slashes# for example: $in = " test''test "# function return: "test\'\'test"#function format_text_item($in){ // $in = trim($in); if ((substr($in, 0, 2) == "\r\n")) { $in = substr($in, 2); } $in = addslashes($in); return "\"$in\"";}############################################################ recursive function tree_to_tertiary_operator: return # tertiary operator string, which was built from tree#function tree_to_tertiary_operator(& $node){ $out = ''; $dataref = $node['data']; $node_items = array(); for ($i = 0; $i < count($node['data']); $i++) { $data_item = & $node['data'][$i]; if (is_array($data_item)) { $if_block = '(('.$data_item['if']['conditional'].') ? ('; $if_data = tree_to_tertiary_operator($data_item['if']); $if_block .= $if_data.') : '; if (!is_array($data_item['elseif']) && !is_array($data_item['else'])) { $if_block .= "''"; } elseif (!is_array($data_item['elseif']) && is_array($data_item['else'])) { $else_block = tree_to_tertiary_operator($data_item['else']); $if_block .= "($else_block)"; } else { $elif_block = elsif_array_to_tertiary_operator($data_item['elseif'], $data_item['else']); $if_block .= "($elif_block)"; } array_push ($node_items, $if_block.')'); } else { array_push ($node_items, format_text_item($data_item)); } } $out .= join('.', $node_items); // changed if (empty($out)) { $out = '""'; } return $out;}################################################################### function elsif_array_to_tertiary_operator: return# tertiary operator string, which was built from tree for # elseif operator##function elsif_array_to_tertiary_operator (& $elsif_array, & $else_hash){ $out = '('; $elsif_hash = array_shift($elsif_array); $out .= "(".$elsif_hash['conditional'].") ? ("; $out .= tree_to_tertiary_operator($elsif_hash); $out .= ") : "; if (count($elsif_array) > 0) { $out .= elsif_array_to_tertiary_operator($elsif_array, $else_hash); } elseif (is_array($else_hash)) { $out .= "("; $out .= tree_to_tertiary_operator($else_hash); $out .= ")"; } else { $out .= "\"\""; } $out .= ")"; return $out;}################################################################ recursive function lex_queue_to_tree: return# tree. This function check also syntax for all lexemes##function lex_queue_to_tree(& $root_node,& $lex_queue, $level_deep){ $ignore_level_up = 0; do { $next_item = array_shift($lex_queue); if ($next_item['type'] == 'text') { array_push ($root_node['data'], $next_item['value']); } elseif ($next_item['type'] == 'if') { $conditional = array_shift($lex_queue); if(!($conditional['type'] == 'conditional' && $conditional['value'] != "")) { die ("If requires conditional statement"); } $new_check_node['if']['parent'] = & $new_check_node; array_push ($root_node['data'], array( 'if' => array( 'conditional' => $conditional['value'], 'data' => array() ) )); $ignore_level_up = lex_queue_to_tree($root_node['data'][count($root_node['data']) - 1]['if'], $lex_queue, $level_deep + 1); } elseif ($next_item['type'] == 'elseif') { if ($ignore_level_up > 0) $ignore_level_up = 0; else { array_unshift($lex_queue, $next_item); return 1; } $conditional = array_shift($lex_queue); if(!($conditional['type'] == 'conditional' && $conditional['value']!="")) { die ("ElseIf requires conditional statement"); } if(!(is_array($root_node['data'][count($root_node['data']) - 1]))) { die ("ElseIf requires preceeding If"); } if (!is_array($root_node['data'][count($root_node['data']) - 1]['elseif'])) { $root_node['data'][count($root_node['data']) - 1]['elseif'] = array(); } array_push($root_node['data'][count($root_node['data']) - 1]['elseif'], array( 'conditional' => $conditional['value'], 'data' => array() )); $ignore_level_up = lex_queue_to_tree($root_node['data'][count($root_node['data']) - 1]['elseif'] [count($root_node['data'][count($root_node['data']) - 1]['elseif']) - 1], $lex_queue, $level_deep + 1); } elseif ($next_item['type'] == 'else') { if ($ignore_level_up > 0) $ignore_level_up = 0; else { array_unshift($lex_queue, $next_item); return 1; } if(!(is_array($root_node['data'][count($root_node['data']) - 1]))) { die ("Else requires preceeding If"); } if (defined($root_node['data'][count($root_node['data']) - 1]['else'])) { die ("Else already defined for If"); } $root_node['data'][count($root_node['data']) - 1]['else'] = array( 'data' => array() ); lex_queue_to_tree($root_node['data'][count($root_node['data']) - 1]['else'], $lex_queue, $level_deep + 1); } elseif ($next_item['type'] == 'endif') { if(!$level_deep) { die ("EndIf requires preceeding If"); } return 0; } elseif ($next_item['type'] == 'conditional') { die ("Unexpected conditional statement, probably bug in parser\n"); } } while (count($lex_queue) > 0); if ($level_deep) { die("No enough EndIf's\n"); } return 0;}######################################################################### function text_to_lexemes_queue: return hash, which contain # queue with lexemes from template##function text_to_lexemes_queue($text){ #list ($parse_conditional, $consume_chars) = (0, 0); $parse_conditional = 0; $consume_chars = 0; $out = array(); do { $parse_conditional = 0; if (preg_match("/^(<\%elseif\s+)/s", $text, $matches)) { $consume_chars = strlen($matches[1]); array_push($out, array( 'type' => 'elseif' )); $parse_conditional = 1; } elseif (preg_match("/^(<\%else\%>)/s",$text,$matches)) { $consume_chars = strlen($matches[1]); array_push($out, array( 'type' => 'else' )); } elseif (preg_match("/^(<\%endif\%>)/s",$text, $matches)) { $consume_chars = strlen($matches[1]); array_push($out, array( 'type' => 'endif' )); } elseif (preg_match("/^(<\%if\s+)/s", $text,$matches)) { $consume_chars = strlen($matches[1]); array_push($out, array( 'type' => 'if' )); $parse_conditional = 1; } elseif (preg_match("/^(.)/s", $text, $matches)) { $consume_chars = 1; $textchar = $matches[1]; if ($out[count($out)-1]['type'] == 'text') { $out[count($out)-1]['value'] .= $textchar; } else { array_push($out, array('type' => 'text', 'value' => $textchar )); } } $text = substr($text, $consume_chars); if ($parse_conditional) { array_push ($out, array('type' => 'conditional', 'value' => read_conditional($text))); } } while (strlen ($text)); return $out;}################################################################################## function read_conditional: become reference to conditional in# if or elseif statements.##function read_conditional(& $textref){ $out=''; $consume_chars=0; $exit=0; $parse_quoted=0; $quote_char=0; do { $parse_quoted = 0; if ((preg_match("/^(\')/", $textref,$matches)) || (preg_match("/^(\")/",$textref,$matches))) { $quote_char = $matches[1]; $out .= $quote_char; $consume_chars = 1; $parse_quoted = 1; } elseif (preg_match("/^(\%>)/",$textref)) { $consume_chars = 2; $exit = 1; } elseif (preg_match("/^(.)/s", $textref, $matches)) { $out .= $matches[1]; $consume_chars = 1; } elseif (!strlen($textref)) { die ("Unexpected end of text while reading PHP conditional statement"); } $textref = substr($textref, $consume_chars); if ($parse_quoted) { $out .= read_quoted($textref, $quote_char); } } while (! $exit); # (PHP syntax) check out with eval return $out;}###################################################################### function read_quoted: function for testing quoted text##function read_quoted (& $textref, $quote_char){ $regexp_quote = AddSlashes($quote_char); $out = ''; $consume_chars = 0; $exit_quote = 0; do { if ((preg_match("/^\\$regexp_quote/",$textref)) || (preg_match("/^\\\\/", $textref))) { $consume_chars = 2; } elseif (preg_match("/^$regexp_quote/", $textref)) { $consume_chars = 1; $exit_quote = 1; } elseif (preg_match("/^(.)/s", $textref)) { $consume_chars = 1; } elseif (!strlen($textref)) { die ("Unexpected end of text while reading quoted string"); } $out .= substr($textref, 0, $consume_chars); $textref = substr($textref, $consume_chars); } while (! $exit_quote); return $out;}function parse_conditionals($template) { $template = preg_replace("#\s?<%!--.*--!%>\s?#", '', $template); if ($GLOBALS['session_url']) { $template = preg_replace('#\.php(\?)?#ies', '\'.php{$GLOBALS[session_url]}\'.((\'\1\' != \'\') ? (\'{$GLOBALS[session_ampersand]}\') : (\'\'))', $template); } $lex_queue = text_to_lexemes_queue($template); $root = array('data' => array()); if (lex_queue_to_tree($root, $lex_queue, 0)) { die ("Else already defined or ElseIf without If\n"); } $output = tree_to_tertiary_operator($root); $output = get_loops($output); return $output;}function get_loops ($template) { $template = preg_replace('#<%loop (\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*) ?%>(.*)<%endloop%>#iUse', "loop_code('\\1', '\\2')",$template); return $template;}function loop_code($loop_name, $loop_code) { $loop_name = stripslashes($loop_name); $loop_code = stripslashes($loop_code); $loop_name2 = substr($loop_name, 1); $loop_code = str_replace("'", "loop-temp-section", $loop_code); return " \" . doloop('$loop_name2', $loop_name, '$loop_code', \$GLOBALS) . \"";}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -