[Astrospaces-commits] SF.net SVN: astrospaces: [95] trunk/functions/template.php
Brought to you by:
p3net
From: <cal...@us...> - 2007-08-06 05:15:14
|
Revision: 95 http://astrospaces.svn.sourceforge.net/astrospaces/?rev=95&view=rev Author: caleb870 Date: 2007-08-05 22:15:04 -0700 (Sun, 05 Aug 2007) Log Message: ----------- A complete fix-up of the template system. It's almost done as language files need to be implemented yet. And I MIGHT even work on caching. Modified Paths: -------------- trunk/functions/template.php Modified: trunk/functions/template.php =================================================================== --- trunk/functions/template.php 2007-08-06 05:12:05 UTC (rev 94) +++ trunk/functions/template.php 2007-08-06 05:15:04 UTC (rev 95) @@ -25,13 +25,20 @@ var $slices; var $var; var $lang; - var $lang_prefix = 'lang:'; + var $lang_prefix = 'lang:'; + var $lang_prefix_reg = 'lang:'; + var $slice_prefix_reg = 'slice:'; + var $slice_prefix = 'slice:'; + var $start_symbol_reg = '\['; + var $end_symbol_reg = '\]'; var $start_symbol = '['; var $end_symbol = ']'; - var $slice_start = '<!-- START %s -->'; // The %s is required - var $slice_end = '<!-- END %s -->'; // The %s is required + var $slice_start = '\<\!-- START %s --\>'; // The %s is required + var $slice_end = '\<\!-- END %s --\>'; // The %s is required + var $slice_array; // System-only variable + //var $line_break = '\r\n'; // Only SINGLE quotes /* [FUNCTIONS] @@ -51,8 +58,20 @@ $var_name - Name of variable $add_what - Add what to the variable $parent (optional) - Parent of variable. Meant for situations when using slices. + set - Sets an array or variables. + $var_array - Array of variables to set. Valid input would be like: + array('var_one' => 'value', 'var_two' => 'another value') + $slice_name - Name of slice to set the variables of. Is set to the root template by default. + set_multi - Sets an array of variables to a slice and then parses it. Then sets the next + set of variables, and parses until the array is fully iterated. + Svar_array - Array of variables to set. Valid input would be like: + array(array('var1' => 'value', 'var2' => 'value again'), + array('var1' => 'new value', 'var2' => 'another new value')) + $slice_name - Name of slice to set the variables of. Is set to the root template by default. [ SLICES & SLICE PARSING ] + parse_slice_to_parent - Parses a slices result to it location in it's parent. + $slice_name - Name of slice to parse. parse_slice_to_var - Parse the result of a slice to a variable $slice_name - Name of slice to be parsed $root_var_name - Name of variable to parse the slice to. @@ -100,22 +119,21 @@ function load( $template ) { - $this->slice_start = preg_quote($this->slice_start); - $this->slice_end = preg_quote($this->slice_end); + $template = $this->parse_lang_vars($template); + $this->slices['root']['template'] = $template; + $this->slices['root']['result'] = $template; + $this->slices['root']['name'] = 'root'; + $regex = '/'.$this->slice_start('(.*)').'/smiU'; + preg_match_all($regex, $template, $slice_array); + $this->slice_array = $slice_array[1]; - $this->start_symbol = preg_quote($this->start_symbol); - $this->end_symbol = preg_quote($this->end_symbol); - - $this->template = $template; - $this->result = $template; - $this->compile_slices(); // KEEP THIS HERE! } function load_lang_file ( $filename ) { @$array = include($filename); - if ($array === true) + if ($array != false) { $this->lang = array_merge($this->lang, $array); } else { @@ -123,132 +141,195 @@ } } - function langValue ( $var_name ) + function langData ( $array ) { - if ($this->lang[$var_name] != NULL) - { - return $this->lang[$var_name]; - } else { - return false; - } + $this->lang = array_merge($this->lang, $array); } - function langPrefix($name) + function parse_lang_vars( $input ) { - return $this->lang_prefix . $name; + if (empty($this->lang)) return $input; + + foreach ($this->lang as $name => $value) + { + $input = str_replace($this->start_symbol.$this->lang_prefix.$name.$this->end_symbol, $value, $input); + } + return $input; } - function slice_start ( $name ) { return sprintf( $this->slice_start, $name); } + function slice_start ( $name ) { return sprintf( $this->slice_start, $name); } // System-only function - function slice_end ( $name ) { return sprintf( $this->slice_end, $name); } + function slice_end ( $name ) { return sprintf( $this->slice_end, $name); } // System-only function - function compile_slices ($parent = null) + function determine_parent( $name ) // System-only function. No longer usable after compile_slices(). { - if (!empty($parent)) + $name_reg = preg_quote( $name ); + + if (count($this->slice_array) === 0) return 'root'; + foreach ($this->slice_array as $slice) { - // Searchs for slices in a specified slice - $regex = '/'. $this->slice_start($slice_name) .'(?:.*)'.$this->slice_start('(.*)').'(?:.*)'.$this->slice_end($slice_name).'/smiU'; - preg_match_all( $regex, $this->template, $sub_slices); - } else { - $regex = '/'.$this->slice_end('(.*)').'/smiU'; - preg_match_all( $regex, $this->template, $sub_slices); + $slice_reg = preg_quote($slice); + $regex = '/'.$this->slice_start($slice_reg).'(?:.*)'.$this->slice_start($name_reg).'(?:.*)'.$this->slice_end($slice_reg).'/sm'; + if (preg_match($regex, $this->slices['root']['template'], $results)) + $array[$slice] = strlen($results[0]); } - foreach ($sub_slices[1] as $slice) + + if (count($array) === 0) return 'root'; + foreach ($array as $slice_name => $number) { - if ($this->count_slices($slice) > 0) + if (isset($biggest_num)) { - $this->compile_slices($slice); + if ($number < $biggest_num) + { + $biggest_num = $number; + $biggest_slice = $slice_name; + } } else { - $this->assemble_slice($slice); + $biggest_num = $number; + $biggest_slice = $slice_name; } } - if (!empty($parent)) + return $biggest_slice; + } + + function compile_slices () // System-only function + { + $regex = '/'.$this->slice_end('(.*)').'/smiU'; + preg_match_all( $regex, $this->slices['root']['template'], $sub_slices); + foreach ($sub_slices[1] as $slice) { - $this->assemble_slice($parent); + $this->assemble_slice($slice); } - } - function assemble_slice ( $slice_name ) + function assemble_slice ( $slice_name ) // System-only function { - $regex = '/'.$this->slice_start($slice_name).'(.*)\n\s*'.$this->slice_end($slice_name).'\n?/si'; - preg_match($regex, $this->template, $resultset); + $regex = '/'.$this->slice_start($slice_name).'(.*)\r\n\s*'.$this->slice_end($slice_name).'\s*\r?\n?/si'; + preg_match($regex, $this->slices['root']['template'], $resultset); if (count($resultset) > 0) { $this->slices[$slice_name]['template'] = $resultset[1]; $this->slices[$slice_name]['result'] = $resultset[1]; $this->slices[$slice_name]['name'] = $slice_name; - $newTemplate = preg_replace($regex,'',$this->template); - $this->template = $newTemplate; - $this->result = $newTemplate; + $this->slices[$slice_name]['parent'] = $this->determine_parent(preg_quote($slice_name)); + $newTemplate = preg_replace($regex, $this->start_symbol.$this->slice_prefix.$slice_name.$this->end_symbol."\r\n", $this->slices['root']['template']); + $this->slices['root']['template'] = $newTemplate; + $this->slices['root']['result'] = $newTemplate; } } function count_slices ( $parent ) { $regex = '/'.$this->slice_start($parent).'(?:.*)('.$this->slice_start('(.*)').')(?:.*)'.$this->slice_end($parent).'/smi'; - preg_match( $regex, $this->template, $sub_slices ); + preg_match( $regex, $this->slices['root']['template'], $sub_slices ); $count = count($sub_slices); return $count; } + + function set($var_array, $slice_name = 'root') + { + foreach ($var_array as $name => $value) + { + $this->define_var($name, $value, $slice_name); + } + } + + function set_multi($var_array, $slice_name = 'root') + { + if ($slice_name == 'root') + { + foreach ($var_array as $id => $vars) + { + foreach ($vars as $var_name => $var_value) + { + $this->define_var($var_name, $var_value, $slice_name); + } + $this->pparse(false); + } + } else { + foreach ($var_array as $id => $vars) + { + foreach ($vars as $var_name => $var_value) + { + $this->define_var($var_name, $var_value, $slice_name); + } + $this->parse_slice_to_var($slice_name, $this->slice_prefix.$slice_name, $this->slices[$parent]['parent'], false); + } + } + } function define_var ( $var_name, $value, $parent = 'root') { - $this->slices[$parent]['vars'][$var_name]['name'] = $var_name; - $this->slices[$parent]['vars'][$var_name]['value'] = $value; + $this->slices[$parent]['vars'][$var_name] = $value; } function add_to_var ( $var_name, $add_what, $parent = 'root' ) { - $this->slices[$parent]['vars'][$var_name]['value'] .= $add_what; + $this->slices[$parent]['vars'][$var_name] .= $add_what; } - function parse_slice_to_var ( $slice_name, $root_var_name, $parent = 'root' ) + function parse_slice_to_var ( $slice_name, $root_var_name, $parent = 'root', $overwrite = true ) // Use parse_slice_to_parent instead { $content = $this->parse_slice( $slice_name ); - $this->define_var($root_var_name, $content, $parent); + if ($overwrite) + { + $this->define_var($root_var_name, $content, $parent); + } else { + $this->add_to_var($root_var_name, $content, $this->slices[$slice_name]['parent']); + } return $parsed_result; } + function parse_slice_to_parent ( $slice_name ) + { + $parent = $this->slices[$slice_name]['parent']; + $root_var_name = $this->slice_prefix.$slice_name; + $content = $this->parse_slice( $slice_name ); + $this->add_to_var($root_var_name, $content, $parent); + return $parsed_result; + } + function parse_slice ( $slice_name ) { if ($this->slices[$slice_name]['vars'] != Null) { - foreach($this->slices[$slice_name]['vars'] as $variable) + foreach($this->slices[$slice_name]['vars'] as $name => $value) { - $replacement_regex = '/' . $this->start_symbol . preg_quote($variable['name']).$this->end_symbol.'\n?/si'; - $result = preg_replace( $replacement_regex, $variable['value'], $this->slices["$slice_name"]['result'] ); + $replacement_regex = '/\r?\n?\s*' . $this->start_symbol_reg . preg_quote($name).$this->end_symbol_reg.'\r?\n?/si'; + $result = preg_replace( $replacement_regex, $value, $this->slices[$slice_name]['result'] ); $this->slices[$slice_name]['result'] = $result; } } - $replacement_regex = '/'.$this->start_symbol.'(.*)'.$this->end_symbol.'\n?/si'; + $replacement_regex = '/\r?\n?'.$this->start_symbol_reg.'(.*)'.$this->end_symbol_reg.'\r?\n?/sU'; $this->slices[$slice_name]['result'] = preg_replace( $replacement_regex, '', $this->slices[$slice_name]['result'] ); $parsed_result = $this->slices[$slice_name]['result']; $this->flush_slice( $slice_name ); + /*$parsed_result = str_replace("\n", "\nLF", $parsed_result); + $parsed_result = str_replace("\r", "CR", $parsed_result);*/ return $parsed_result; } - function parse() + function parse () { if ($this->slices['root']['vars'] != null) { - foreach($this->slices['root']['vars'] as $variable) + foreach($this->slices['root']['vars'] as $name => $value) { - $replacement_regex = '/'.$this->start_symbol.$variable['name'].$this->end_symbol.'\n?/si'; - $result = preg_replace($replacement_regex,$variable['value'],$this->result); - $this->result = $result; + $replacement_regex = '/\r?\n?'.$this->start_symbol_reg.preg_quote($name).$this->end_symbol_reg.'\r?\n?/si'; + $result = preg_replace($replacement_regex,$value,$this->slices['root']['result']); + $this->slices['root']['result'] = $result; } } - $replacement_regex = '/'.$this->start_symbol.'(.*)'.$this->end_symbol.'\n?/si'; - $this->result = preg_replace( $replacement_regex, '', $this->result ); + $replacement_regex = '/\r?\n?'.$this->start_symbol_reg.'(.*)'.$this->end_symbol_reg.'\r?\n?/siU'; + $this->slices['root']['result'] = preg_replace( $replacement_regex, '', $this->slices['root']['result'] ); - $parsed_result = $this->result; + $parsed_result = $this->slices['root']['result']; $this->flush_template(); @@ -267,8 +348,8 @@ function flush_template () { - $this->result = $this->template; - $this->slices['root']['vars'] = null; + $this->slices['root']['result'] = $this->slices['root']['template']; + unset($this->slices['root']['vars']); } function flush_slice ( $slice_name ) @@ -279,9 +360,9 @@ function reset_template () { - $this->template = null; - $this->result = null; + $this->slices['root']['template'] = null; + $this->slices['root']['result'] = null; $this->slices = null; } } -?> +?> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |