/// Description // Perform substitution on the template. we do not really recurse // downward in the sense that we do not do subsitutions on inferior // templates. for each inferior template which is a part of this // template, we insert the current value of their results. //// Notes // Do I want to make this return a reference? Function subst ($ handle, $ tag, $ autoload = true) {$ append = false; $ debug = $ this-> DEBUGALL | $ this-> DEBUG [subst]; $ this-> LAST = $ handle; if ($ debug) $ this-> logwrite ("subst (handle = $ handle, tag = $ tag, autoload = $ autoload) "); // For compatibility with FastTemplate, the results need to overwrite // for an array. this really only seems to be useful in the case of // something like // $ t-> parse (MAIN, Array (array, main); // Where the main template has a variable named MAIN which will be // set on the first pass (I. e ., when parasing array) and used on the // second pass (I. e ., when parsing main ). if (gettype ($ tag) = array) {foreach (array_values ($ tag) as $ t) {if ($ debug) $ this-> logwrite ("subst: calling subst ($ handle, $ t, $ autoload) "); $ this-> subst ($ handle, $ t, $ autoload);} return $ this-> HANDLE [$ handle];} // Period prefix means append result to pre-existing value. if (substr ($ tag, 0, 1) = .) {$ append = true; $ tag = substr ($ tag, 1); if ($ debug) $ this-> logwrite ("subst (handle = $ handle, tag = $ tag, autoload = $ autoload) in append mode ");} // $ this-> TEMPLATE [$ tag] will only be set if it was explicitly // declared via define (); I. e ., inferior templates will not have an // entry. if (iss Et ($ this-> TEMPLATE [$ tag]) {if (! Isset ($ this-> TEMPLATE [$ tag] [parsed]) |! $ This-> TEMPLATE [$ tag] [parsed]) $ this-> parse_internal ($ tag);} else {if (! $ This-> DYNAMIC) {$ this-> error ("subst (handle = $ handle, tag = $ tag, autoload = $ autoload ):". no such tag and dynamic templates are turned off, true);} if ($ autoload) {if ($ debug) $ this-> logwrite ("subst: TEMPLATE [tag = $ tag] not found, trying autoload "); foreach (array_keys ($ this-> TEMPLATE) as $ t) {if ($ debug) $ this-> logwrite ("subst: calling parse_internal (tag = $ t)"); if (! Isset ($ this-> TEMPLATE [$ tag] [parsed]) |! $ This-> TEMPLATE [$ tag] [parsed]) $ this-> parse_internal ($ t);} if ($ debug) $ this-> logwrite (subst: retrying with autoload = false); $ this-> subst ($ handle, $ tag, false); if ($ debug) $ this-> logwrite (subst: completed with autoload = false); return;} else {$ this-> error ("subst (handle = $ handle, tag = $ tag, autoload = $ autoload ): no such tag ", true) ;}} if (! $ Append) {$ this-> TEMPLATE [$ tag] [result] =; if ($ debug) $ this-> logwrite ("subst (handle = $ handle, tag = $ tag, autoload = $ autoload) in overwrite mode ");} if ($ debug) $ this-> logwrite (subst: type (this-> TEMPLATE [$ tag] [part]) =>. gettype ($ this-> TEMPLATE [$ tag] [part]); // Hmmm, clear () called before subst () seems to result in this not // being defined which leaves me a bit confused .... $ result =; if (is Set ($ this-> TEMPLATE [$ tag] [part]) {reset ($ this-> TEMPLATE [$ tag] [part]); foreach (array_keys ($ this-> TEMPLATE [$ tag] [part]) as $ p) {if ($ debug) $ this-> logwrite ("subst: looking at TEMPLATE [$ tag] [part] [$ p] "); $ tmp = $ this-> TEMPLATE [$ tag] [part] [$ p]; // Dont try if ($ p = parent ).... if (strcmp ($ p, parent) = 0) {if ($ debug) $ this-> logwrite ("subst: skipping part $ p"); $ tmp = ;} else if (gettype ($ t His-> TEMPLATE [$ tag] [part] [$ p]) = string) {if ($ debug) $ this-> logwrite ("subst: using part $ p "); reset ($ this-> VAR); // Because we treat VAR and HANDLE separately (unlike // class. fastTemplate. php3), we have to iterate over both or we // miss some substitutions and are not 100% compatible. while (list ($ key, $ val) = each ($ this-> VAR) {if ($ debug) $ this-> logwrite ("subst: substituting VAR $ key = $ Val in $ tag "); $ key = {. $ key .}; $ tmp = str_replace ($ key, $ val, $ tmp);} reset ($ this-> HANDLE); while (list ($ key, $ val) = each ($ this-> HANDLE) {if ($ debug) $ this-> logwrite ("subst: substituting HANDLE $ key = $ val in $ tag "); $ key = {. $ key .}; $ tmp = str_replace ($ key, $ val, $ tmp);} $ result. = $ tmp;} else {$ xtag = $ this-> TEMPLATE [$ tag] [part] [$ p] [tag]; if ($ debug) {$ this-> logwrite ("subst: substi Tuting other tag $ xtag result in $ tag ");} // The assignment is a no-op if the result is not set, but when // E_ALL is in effect, a warning is generated without the // isset () test. if (isset ($ this-> TEMPLATE [$ xtag] [result]) $ result. = $ this-> TEMPLATE [$ xtag] [result] ;}}if ($ this-> STRICT) {// if quiet-mode is turned on, skip the check since were not going // to do anything anyway. if (! $ This-> QUIET) {if (preg_match ($ this-> REGEX_VAR, $ result) {$ this-> error ("Unmatched tags still present in $ tag
") ;}} Else {$ result = preg_replace ($ this-> REGEX_VAR, $ result);} if ($ append) {if ($ debug) {$ this-> logwrite ("subst: appending TEMPLATE [$ tag] [result] = $ result"); $ this-> logwrite ("subst: old HANDLE [$ handle] ={$ this-> HANDLE [$ handle]} "); $ this-> logwrite (" subst: old TEMPLATE [$ tag] [result] = {$ this-> TEMPLATE [$ tag] [result]} ");} // The isset () tests are to suppresss warning when E_ALL is in Effect // and the variables have not actually been set yet (even though the // user specified append-mode ). if (isset ($ this-> HANDLE [$ handle]) $ this-> HANDLE [$ handle]. = $ result; else $ this-> HANDLE [$ handle] = $ result; if (isset ($ this-> TEMPLATE [$ tag] [result]) $ this-> TEMPLATE [$ tag] [result]. = $ result; else $ this-> TEMPLATE [$ tag] [result] = $ result; if ($ debug) {$ this-> logwrite ("subst: new HANDLE [$ Handle] ={$ this-> HANDLE [$ handle]} "); $ this-> logwrite (" subst: new TEMPLATE [$ tag] [result] = {$ this-> TEMPLATE [$ tag] [result]} ") ;}} else {if ($ debug) $ this-> logwrite ("subst: setting TEMPLATE [$ tag] [result] = $ result"); $ this-> HANDLE [$ handle] = $ result; $ this-> TEMPLATE [$ tag] [result] = $ result;} return $ this-> HANDLE [$ handle];} /// Description // Clear a block from a template. the intent is to r Emove an inferior // template from a parent. this works even if the template has already // been parsed since we go straight to the specified template and clear // the results element. if the given template has not yet been // loaded, the load is forced by calling parse_internal (). // function clear_dynamic ($ tag = NULL) {$ debug = $ this-> DEBUGALL | $ this-> DEBUG [clear_dynamic]; if (is_null ($ tag)) {// Clear all result elements. uhm, needs to be tested. if ($ debug) $ this-> logwrite ("clear_dynamic (NULL)"); foreach (array_values ($ this-> TEMPLATE) as $ t) {$ this-> clear_dynamic ($ t);} return;} else if (gettype ($ tag) = array) {if ($ debug) $ this-> logwrite ("clear_dynamic ($ tag)"); foreach (array_values ($ tag) as $ t) {$ this-> clear_dynamic ($ t );} return;} else if (! Isset ($ this-> TEMPLATE [$ tag]) {if ($ debug) $ this-> logwrite ("clear_dynamic ($ tag) --> $ tag not set, calling parse_internal "); $ this-> parse_internal ($ tag); // $ this-> TEMPLATE [$ tag] = array ();} if ($ debug) $ this-> logwrite ("clear_dynamic ($ tag)"); // $ this-> TEMPLATE [$ tag] [loaded] = true; // $ this-> TEMPLATE [$ tag] [string] =; $ this-> TEMPLATE [$ tag] [result] =; // $ this-> TEMPLATE [$ tag] [clear] = true;} // Description // Clear the results of a handle set by parse (). the input handle can // be a single value, an array, or the PHP constant NULL. for the // last case, all handles cleared. // function clear ($ handle = NULL) {$ debug = $ this-> DEBUGALL | $ this-> DEBUG [clear]; if (is_null ($ handle )) {// Dont bother unsetting them, just set the whole thing to a new, // empty array. if ($ debug) $ this-> logwrite ("clear (NULL)"); $ this-> HANDLE = array ();} else if (gettype ($ handle) = array) {if ($ debug) $ this-> logwrite ("clear ($ handle)"); foreach (array_values ($ handle) as $ h) {$ this-> clear ($ h) ;}} else if (isset ($ this-> HANDLE [$ h