Index: branches/RC/core/kernel/nparser/ntags.php =================================================================== diff -u -N -r10604 -r10610 --- branches/RC/core/kernel/nparser/ntags.php (.../ntags.php) (revision 10604) +++ branches/RC/core/kernel/nparser/ntags.php (.../ntags.php) (revision 10610) @@ -72,9 +72,14 @@ return $this->Parser->Buffers[$this->Parser->Level]; } - function AppendCode(&$o, $code) + function AppendCode(&$o, $code, $php_tags=true) { - $o .= ''; + if ($php_tags) { + $o .= ''; + } + else { + $o .= ( is_array($code) ? "\t".implode("\n\t", $code)."\n" : $code); + } } } @@ -92,7 +97,56 @@ } class _Tag_DefineElement extends _BlockTag { + /*var $ElemName; + + function Open($tag) + { + $o = ''; + $pointer = abs(crc32($tag['file'])).'_'.$tag['line']; + $f_name = $tag['NP']['name'].'_'.$pointer; + $this->ElemName = $tag['NP']['name']; + + $code[] = "\$_parser->Elements['{$tag['NP']['name']}'] = '$f_name';"; + + // function_exists is required here, because a template may be included more than once + // leading to Cannot redeclare error + $code[] = "if (!function_exists('{$f_name}')) {"; + $code[] = "function $f_name(&\$_parser, \$params) {"; + $code[] = "global \$application;"; + $code[] = "if (!\$_output = \$_parser->CacheStart('{$pointer}')) {"; + + $defaults = $this->Parser->CompileParamsArray($tag['NP']); + + $code[] = "\$params = array_merge($defaults, \$params);"; + $code[] = "if (!isset(\$params['PrefixSpecial']) && isset(\$params['prefix'])) {\$params['PrefixSpecial'] = \$params['prefix'];};"; + $code[] = "extract(\$params);"; + $code[] = "\$_parser->SetParams(\$params);"; + $code[] = 'ob_start();'; + $this->AppendCode($o, $code, false); + return $o . '?'.'>'; + } + + function Close($tag) + { + $o = $this->Parser->Buffers[$this->Parser->Level]; + $code[] = "\$_parser->CacheEnd();\n"; + $code[] = '$_output = ob_get_contents();'; + $code[] = 'ob_end_clean();'; + $code[] = '}'; + $code[] = "return \$_output === true ? '' : \$_output;"; + $code[] = '}}'; + + $code[] = "\$_parser->CachableElements['".$this->ElemName."'] = ".($this->Parser->Cachable[$this->Parser->Level] ? 'true':'false').';'; + + $o .= 'AppendCode($o, $code, false); + + return $o; +// $this->Parser->Definitions .= $o."\n"; +// return ''; + } */ + function _Tag_DefineElement($tag) { parent::_BlockTag($tag); @@ -155,6 +209,7 @@ $tag['NP']['name'] = '__capture_'.$tag['NP']['to_var']; $o = ''; + // $this->AppendCode($o, "\$_parser->Captures['{$tag['NP']['to_var']}'] = 1;", false); $this->AppendCode($o, "\$_parser->Captures['{$tag['NP']['to_var']}'] = 1;"); $o .= parent::Open($tag); return $o; @@ -187,6 +242,18 @@ return $o; } $to_pass = $this->Parser->CompileParamsArray($tag['NP']); +/* $pointer = abs(crc32($tag['file'])).'_'.$tag['line']; +// $code[] = "}"; +// $code[] = "if (!\$_parser->CachableElements['".$tag['NP']['name']."']) {"; +// $code[] = "\$_parser->CacheEndInside();"; +// $code[] = "}"; + $o .= 'AppendCode($o, $this->Parser->BreakCache('', $pointer.'a', "\$_parser->CachableElements['".$tag['NP']['name']."']"), false); + $this->AppendCode($o, "echo (\$_parser->ParseBlock($to_pass));\n", false); + $this->AppendCode($o, $this->Parser->BreakCache('', $pointer.'b') . " ?".">\n", false); +// $this->AppendCode($o, "if (!\$_parser->CacheStartOrContinue(\$_parser->CachableElements['".$tag['NP']['name']."'], '{$pointer}')) {".' ?'.'>', false); +*/ $this->AppendCode($o, "echo (\$_parser->ParseBlock($to_pass));"); return $o; } @@ -344,3 +411,22 @@ return $o; } } + +class _Tag_Cache extends _BlockTag { + + function Open($tag) + { + $pointer = abs(crc32($tag['file'])).'_'.$tag['line']; + $o = ''; + $this->AppendCode($o, "if (!\$_parser->CacheStart('{$pointer}')) {\n"); + return $o; + } + + function Close($tag) + { + $o = $this->Parser->Buffers[$this->Parser->Level]; + $this->AppendCode($o, "\$_parser->CacheEnd();\n}\n"); + return $o; + } + +}