21 require_once
'HTML/Template/IT.php';
22 require_once
'HTML/Template/IT_Error.php';
121 $this->checkblocknameRegExp =
'@' . $this->blocknameRegExp .
'@';
122 $this->functionRegExp =
'@' . $this->functionPrefix .
'(' .
123 $this->functionnameRegExp .
')\s*\(@sm';
134 $this->
template =
'';
166 if (!isset($this->blocklist[$block])) {
168 "The block ".
"'$block'".
169 " does not exist in the template and thus it can't be replaced.",
175 return new IT_Error(
'No block content given.', __FILE__, __LINE__);
186 $parents = $this->blockparents[$block];
188 $this->blockparents[$block] = $parents;
251 if ($placeholder ==
'') {
252 return new IT_Error(
'No variable placeholder given.',
255 }
elseif ($blockname ==
'' ||
256 !preg_match($this->checkblocknameRegExp, $blockname)
258 return new IT_Error(
"No or invalid blockname '$blockname' given.",
262 return new IT_Error(
'No block content given.', __FILE__, __LINE__);
263 }
elseif (isset($this->blocklist[$blockname])) {
264 return new IT_Error(
'The block already exists.',
271 if (count($parents) == 0) {
274 "The variable placeholder".
275 " '$placeholder' was not found in the template.",
279 }
elseif (count($parents) > 1) {
282 while (list($k, $parent) = each($parents)) {
285 $msg = substr($parent, -2);
287 return new IT_Error(
"The variable placeholder ".
"'$placeholder'".
288 " must be unique, found in multiple blocks '$msg'.",
295 if ($this->flagBlocktrouble) {
298 $this->blockinner[$parents[0]][] = $blockname;
299 $this->blocklist[$parents[0]] = preg_replace(
300 '@' . $this->openingDelimiter . $placeholder .
301 $this->closingDelimiter .
'@',
303 $this->openingDelimiter .
'__' . $blockname .
'__' .
304 $this->closingDelimiter,
306 $this->blocklist[$parents[0]]
346 if ($placeholder ==
'') {
347 new IT_Error(
'No placeholder name given.', __FILE__, __LINE__);
351 if ($block !=
'' && !isset($this->blocklist[$block])) {
352 new IT_Error(
"Unknown block '$block'.", __FILE__, __LINE__);
360 if (is_array($variables = $this->blockvariables[$block])) {
363 while (list($k, $variable) = each($variables)) {
364 if ($k == $placeholder) {
374 reset($this->blockvariables);
375 while (list($blockname, $variables) = each($this->blockvariables)){
376 if (is_array($variables) && isset($variables[$placeholder])) {
394 reset($this->functions);
395 while (list($func_id, $function) = each($this->functions)) {
396 if (isset($this->callback[$function[
'name']])) {
397 if ($this->callback[$function[
'name']][
'expandParameters']) {
398 $callFunction =
'call_user_func_array';
400 $callFunction =
'call_user_func';
403 if ($this->callback[$function[
'name']][
'object'] !=
'') {
407 &
$GLOBALS[$this->callback[$function[
'name']][
'object']],
408 $this->callback[$function[
'name']][
'function']),
415 $this->callback[$function[
'name']][
'function'],
419 $this->variableCache[
'__function' . $func_id .
'__'] = $call;
445 $this->variableCache[
'__function' . $functionID .
'__'] = $replacement;
496 setCallbackFunction($tplfunction, $callbackfunction, $callbackobject =
'', $expandCallbackParameters=
false)
498 if ($tplfunction ==
'' || $callbackfunction ==
'') {
500 "No template function ".
"('$tplfunction')".
501 " and/or no callback function ('$callback') given.",
505 $this->callback[$tplfunction] = array(
506 'function' => $callbackfunction,
507 'object' => $callbackobject,
508 'expandParameters' => (
boolean) $expandCallbackParameters
538 if (isset($this->blockinner[$block])) {
539 foreach ($this->blockinner[$block] as $k => $inner) {
543 unset($this->blockinner[$block]);
546 unset($this->blocklist[$block]);
547 unset($this->blockdata[$block]);
548 unset($this->blockvariables[$block]);
549 unset($this->touchedBlocks[$block]);
563 foreach ($this->blocklist as $block => $content) {
580 return isset($this->blocklist[$blockname]);
593 if (!isset($this->blockvariables[$block])) {
597 $variables = array();
598 foreach ($this->blockvariables[$block] as $variable => $v) {
599 $variables[$variable] = $variable;
616 return isset($this->blockvariables[$block][$variable]);
625 $this->functions = array();
630 while (preg_match($this->functionRegExp,
$template, $regs)) {
638 $search = $regs[0] . $head .
')';
640 $replace = $this->openingDelimiter .
641 '__function' . $num .
'__' .
644 $this->
template = str_replace($search, $replace, $this->
template);
647 while ($head !=
'' && $args2 = $this->
getValue($head,
',')) {
648 $arg2 = trim($args2);
649 $args[] = (
'"' == $arg2{0} ||
"'" == $arg2{0}) ?
650 substr($arg2, 1, -1) : $arg2;
651 if ($arg2 == $head) {
654 $head = substr($head, strlen($arg2) + 1);
657 $this->functions[$num++] = array(
680 if (!is_array($delimiter)) {
681 $delimiter = array( $delimiter =>
true );
684 $len = strlen($code);
688 if (isset($delimiter[$code[0]])) {
691 for ($i = 0; $i < $len; ++$i) {
695 ($char ==
'"' || $char ==
"'") &&
696 ($char == $enclosed_by ||
'' == $enclosed_by) &&
697 (0 == $i || ($i > 0 &&
'\\' != $code[$i - 1]))
701 $enclosed_by = $char;
705 $enclosed = !$enclosed;
709 if (!$enclosed && isset($delimiter[$char])) {
715 return substr($code, 0, $i);
728 if (!is_array($variables)) {
729 $variables = array($variables =>
true);
732 reset($this->blockvariables[$block]);
733 while (list($varname, $val) = each($this->blockvariables[$block])) {
734 if (isset($variables[$varname])) {
735 unset($this->blockvariables[$block][$varname]);
748 preg_match_all( $this->variablesRegExp,
749 $this->blocklist[$block], $regs
752 if (count($regs[1]) != 0) {
753 foreach ($regs[1] as $k => $var) {
754 $this->blockvariables[$block][$var] =
true;
757 $this->blockvariables[$block] = array();
761 if (isset($this->blockinner[$block]) &&
762 is_array($this->blockinner[$block]) &&
763 count($this->blockinner[$block]) > 0
769 foreach ($this->blockinner[$block] as $childBlock) {
786 reset($this->blocklist);
787 while (list($blockname, $content) = each($this->blocklist)) {
788 reset($this->blockvariables[$blockname]);
790 list($varname, $val) = each($this->blockvariables[$blockname]))
792 if ($variable == $varname) {
793 $parents[] = $blockname;
814 'HTML_Template_ITX Warning: %s [File: %s, Line: %d]',
820 $this->warn[] = $message;
822 if ($this->printWarning) {
826 if ($this->haltOnWarning) {