Index: branches/RC/core/kernel/nparser/ntags.php
===================================================================
diff -u -N
--- branches/RC/core/kernel/nparser/ntags.php (revision 11934)
+++ branches/RC/core/kernel/nparser/ntags.php (revision 0)
@@ -1,601 +0,0 @@
-Tag = $tag;
- }
-
- function Open($tag)
- {
- if (!$this->_checkRequiredParams($tag)) {
- return false;
- }
-
- return '';
- }
-
- /**
- * Checks, that all required attributes for tag are passed
- *
- * @param Array $tag
- * @return bool
- */
- function _checkRequiredParams($tag)
- {
- $missing_params = array_diff($this->_requiredParams, array_keys($tag['NP']));
- if (!$missing_params) {
- return true;
- }
-
- $error_msg = 'Tag ' . $this->Parser->TagInfo($tag, true) . ' called without required ' . implode(', ', $missing_params) . ' attribute';
- if (count($missing_params) > 1) {
- $error_msg .= '(-s)';
- }
-
- $this->Application->handleError(E_USER_ERROR, $error_msg, $tag['file'], $tag['line']);
- return false;
- }
-
- /**
- * All tags inside block tag are passed through to this method
- * Any returned result is appened to current level's buffer
- * This can be used to implement special handling of such tags as
- *
- * @param unknown_type $tag
- * @return unknown
- */
- function PassThrough(&$tag)
- {
- return '';
- }
-
- function Close($tag)
- {
- return $this->Parser->Buffers[$this->Parser->Level];
- }
-
- function AppendCode(&$o, $code, $php_tags=true)
- {
- if ($php_tags) {
- $o .= ''."php\n" . ( is_array($code) ? "\t".implode("\n\t", $code)."\n" : $code) .'?>';
- }
- else {
- $o .= ( is_array($code) ? "\t".implode("\n\t", $code)."\n" : $code);
- }
- }
-}
-
-class _Tag_Comment extends _BlockTag {
-
- function PassThrough(&$tag)
- {
- $tag['processed'] = true;
- }
-
- function Close($tag)
- {
- return '';
- }
-}
-
-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 .= ''.'php';
- $this->AppendCode($o, $code, false);
-
- return $o;
-// $this->Parser->Definitions .= $o."\n";
-// return '';
- } */
-
- function _Tag_DefineElement($tag)
- {
- parent::_BlockTag($tag);
-
- $this->_requiredParams = Array ('name');
- }
-
- function Open($tag)
- {
- $o = parent::Open($tag);
-
- if ($o === false) {
- // some required params not passed
- return $o;
- }
-
- $f_name = $tag['NP']['name'].'_'.abs(crc32($tag['file'])).'_'.$tag['line'];
- $this->Tag['function_name'] = $f_name; // for later use in closing tag
-
- $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;";
-
- $tag['NP'] = $this->_extractParams($tag['NP']);
- $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);
- return $o;
- }
-
- /**
- * Converts $param_name to $params['param_name']
- *
- * @param Array $params
- * @return Array
- */
- function _extractParams($params)
- {
- foreach ($params as $param_name => $param_value) {
- $params[$param_name] = preg_replace('/[\{]{0,1}([\$])(.*?[^\$\s\{\}]*)[\}]{0,1}/', '{$params[\'\\2\']}', $param_value);
- }
-
- return $params;
- }
-
- function Close($tag)
- {
- $o = $this->Parser->Buffers[$this->Parser->Level];
- $code[] = '$_output = ob_get_contents();';
- $code[] = 'ob_end_clean();';
- $code[] = 'return $_output;';
- $code[] = '}}';
-
- $end_pos = $tag['pos'] + strlen($tag['opening']) + strlen($tag['tag']) + strlen($tag['closing']) + TAG_NAMESPACE_LENGTH;
- $code[] = "\$_parser->ElementLocations['{$this->Tag['function_name']}'] = Array('template' => '{$this->Tag['template']}', 'start_pos' => {$this->Tag['pos']}, 'end_pos' => {$end_pos});";
-
- $this->AppendCode($o, $code);
- return $o;
- }
-}
-
-class _Tag_Capture extends _Tag_DefineElement {
-
- function _Tag_Capture($tag)
- {
- parent::_Tag_DefineElement($tag);
-
- $this->_requiredParams = Array ('to_var');
- }
-
- function Open($tag)
- {
- if (!$this->_checkRequiredParams($tag)) {
- return false;
- }
-
- $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;
- }
-}
-
-class _Tag_RenderElement extends _Tag_DefineElement {
- var $Single = true;
- var $OriginalTag;
-
- var $_lambdaName = '';
-
- function _Tag_RenderElement($tag)
- {
- parent::_Tag_DefineElement($tag);
-
- if (!$tag['is_closing']) {
- $this->_requiredParams = Array ('design');
- }
- }
-
- function Open($tag)
- {
- if (!$this->_checkRequiredParams($tag)) {
- return false;
- }
-
- $o = '';
- if ($tag['is_closing']) {
- if (isset($tag['NP']['design'])) {
- $this->RenderDesignCode($o, $tag['NP']);
- 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 .= ''.'php ';
-
- $this->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;
- }
- $this->Single = false;
- $this->OriginalTag = $tag;
- $tag['NP']['name'] = $tag['NP']['design'] . '_' . abs(crc32($tag['file'])) . '_' . $tag['line']; //'__lambda';
-
- return parent::Open($tag);
- }
-
- function RenderDesignCode(&$o, $params)
- {
- $to_pass = $this->Parser->CompileParamsArray($params);
- $code[] = "echo (\$_parser->ParseBlock(array_merge($to_pass, array('name'=>\"{$params['design']}\",'content'=>\$_parser->ParseBlock($to_pass), 'keep_data_exists'=>1))));";
- $this->AppendCode($o, $code);
- }
-
- function Close($tag)
- {
- if ($this->Single) {
- return $this->Parser->Buffers[$this->Parser->Level];
- }
- $o = parent::Close($tag);
- $this->OriginalTag['NP']['name'] = $this->OriginalTag['NP']['design'] . '_' . abs(crc32($this->OriginalTag['file'])) . '_' . $this->OriginalTag['line']; //'__lambda';
-
- $this->RenderDesignCode($o, $this->OriginalTag['NP']);
- return $o;
- }
-}
-
-class _Tag_RenderElements extends _BlockTag {
-
- function _Tag_RenderElements($tag)
- {
- parent::_BlockTag($tag);
-
- $this->_requiredParams = Array ('elements');
- }
-
- function Open($tag)
- {
- $o = parent::Open($tag);
-
- if ($o === false) {
- // some required params not passed
- return $o;
- }
-
- $element_names = array_map('trim', explode(',', $tag['NP']['elements']));
- unset($tag['NP']['elements']);
-
- $class = '_Tag_RenderElement';
- $instance = new $class($tag);
- /* @var $instance _Tag_RenderElement */
-
- $instance->Parser =& $this->Parser;
-
- $skip_elements = array_key_exists('skip', $tag['NP']) ? array_map('trim', explode(',', $tag['NP']['skip'])) : Array ();
-
- foreach ($element_names as $element_name) {
- if (in_array($element_name, $skip_elements) || !$element_name) {
- // empty element name OR element should be excluded
- continue;
- }
-
- $tag['NP']['name'] = $element_name;
- $o .= $instance->Open($tag);
- }
-
- return $o;
- }
-}
-
-class _Tag_Param extends _BlockTag {
-
- function _Tag_Param($tag)
- {
- parent::_BlockTag($tag);
-
- $this->_requiredParams = Array ('name');
- }
-
- function Open($tag)
- {
- $o = parent::Open($tag);
-
- if ($o === false) {
- // some required params not passed
- return $o;
- }
-
- $capture_params = $tag['NP'];
- $capture_params['name'] = '__capture_' . $tag['NP']['name'];
-
- $capture_to_pass = $this->Parser->CompileParamsArray($capture_params);
- $code[] = "if (isset(\$_parser->Captures['{$tag['NP']['name']}'])) {";
- $code[] = "\${$tag['NP']['name']} = \$_parser->ParseBlock($capture_to_pass);";
- $code[] = "}";
- $code[] = "else {";
- $to_pass = $this->Parser->CompileParamsArray($tag['NP']);
- $code[] = '$_p_ =& $_parser->GetProcessor(\'m\');';
- $code[] = '$_tag_params = ' . $to_pass . ';';
- $code[] = "\${$tag['NP']['name']} = \$_p_->PostProcess(\${$tag['NP']['name']}, \$_p_->PreparePostProcess(\$_tag_params));";
- $code[] = "}";
-
- if (array_key_exists('plus', $tag['NP'])) {
- $code[] = "\${$tag['NP']['name']} += {$tag['NP']['plus']};";
- }
-
- $code[] = "\$params['{$tag['NP']['name']}'] = \${$tag['NP']['name']};";
- $code[] = "echo (\${$tag['NP']['name']});";
-
- $this->AppendCode($o, $code);
- return $o;
- }
-}
-
-class _Tag_Include extends _BlockTag {
-
- function Open($tag)
- {
- $o = '';
- $to_pass = $this->Parser->CompileParamsArray($tag['NP']);
- $this->AppendCode($o, "echo (\$_parser->IncludeTemplate($to_pass))");
- return $o;
- }
-}
-
-class _Tag_If extends _BlockTag {
-
- /**
- * Permanently inverses if tag (used in ifnot tag)
- *
- * @var bool
- */
- var $_Inversed = false;
-
- /**
- * Count of "elseif" tags inside
- *
- * @var int
- */
- var $_elseIfCount = 0;
-
- function _Tag_If($tag)
- {
- parent::_BlockTag($tag);
-
- $this->_requiredParams = Array ('check');
- }
-
- function Open($tag)
- {
- $o = parent::Open($tag);
-
- if ($o === false) {
- // some required params not passed
- return $o;
- }
-
- $to_pass = $this->Parser->CompileParamsArray($tag['NP']);
-
- $code[] = "\$_splited = \$_parser->SplitTag(array('tag'=>\"{$tag['NP']['check']}\", 'file'=>'{$tag['file']}', 'line'=>{$tag['line']}));";
- $code[] = 'if ($_splited[\'prefix\'] == \'__auto__\') {$_splited[\'prefix\'] = $PrefixSpecial;}';
- $code[] = '$_p_ =& $_parser->GetProcessor($_splited[\'prefix\']);';
- if (isset($tag['NP']['inverse']) || $this->_Inversed) {
- $code[] = "if (!\$_p_->ProcessParsedTag(\$_splited['name'], $to_pass, \$_splited['prefix'], '{$tag['file']}', {$tag['line']})) {";
- }
- else {
- $code[] = "if (\$_p_->ProcessParsedTag(\$_splited['name'], $to_pass, \$_splited['prefix'], '{$tag['file']}', {$tag['line']})) {";
- }
- $this->AppendCode($o, $code);
- return $o;
- }
-
- function PassThrough(&$tag)
- {
- $o = '';
- if ($tag['name'] == 'else') {
- $this->AppendCode($o, '} else {');
- $tag['processed'] = true;
- }
- if ($tag['name'] == 'elseif') {
- if (!$this->_checkRequiredParams($tag)) {
- return '';
- }
-
- $to_pass = $this->Parser->CompileParamsArray($tag['NP']);
-
- $this->_elseIfCount++; // add same count of closing brackets in closing tag
-
- $this->AppendCode($o, "} else {");
-
- $code[] = "\$_splited = \$_parser->SplitTag(array('tag'=>\"{$tag['NP']['check']}\", 'file'=>'{$tag['file']}', 'line'=>{$tag['line']}));";
- $code[] = 'if ($_splited[\'prefix\'] == \'__auto__\') {$_splited[\'prefix\'] = $PrefixSpecial;}';
- $code[] = '$_p_ =& $_parser->GetProcessor($_splited[\'prefix\']);';
- if (isset($tag['NP']['inverse']) || $this->_Inversed) {
- $code[] = "if (!\$_p_->ProcessParsedTag(\$_splited['name'], $to_pass, \$_splited['prefix'], '{$tag['file']}', {$tag['line']})) {";
- }
- else {
- $code[] = "if (\$_p_->ProcessParsedTag(\$_splited['name'], $to_pass, \$_splited['prefix'], '{$tag['file']}', {$tag['line']})) {";
- }
- $this->AppendCode($o, $code);
-
- $tag['processed'] = true;
- }
- return $o;
- }
-
- function Close($tag)
- {
- $o = $this->Parser->Buffers[$this->Parser->Level];
-
- $code = str_repeat("}\n", $this->_elseIfCount + 1);
- $this->AppendCode($o, $code);
-
- return $o;
- }
-}
-
-class _Tag_IfNot extends _Tag_If {
-
- function _Tag_IfNot($tag)
- {
- parent::_Tag_If($tag);
- $this->_Inversed = true;
- }
-
-}
-
-class _Tag_DefaultParam extends _BlockTag {
-
- function Open($tag)
- {
- $o = '';
- foreach ($tag['NP'] as $key => $val) {
- $code[] = 'if (!isset($' . $key . ')) $params[\'' . $key . '\'] = \'' . $val . '\';';
- $code[] = '$' . $key . ' = isset($' . $key . ') ? $' . $key . ' : \'' . $val . '\';';
- $code[] = '$_parser->SetParam(\'' . $key . '\', $' . $key . ');';
- }
- $this->AppendCode($o, $code);
- return $o;
- }
-}
-
-class _Tag_SetParam extends _BlockTag {
-
- function Open($tag)
- {
- $o = '';
- foreach ($tag['NP'] as $key => $val) {
- $code[] = '$params[\'' . $key . '\'] = \'' . $val . '\';';
- $code[] = '$' . $key . ' = \'' . $val . '\';';
- $code[] = '$_parser->SetParam(\'' . $key . '\', $' . $key . ');';
- }
- $this->AppendCode($o, $code);
- 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;
- }
-
-}
-
-class _Tag_IfDataExists extends _BlockTag {
-
- function Open($tag)
- {
- $o = '';
- $code = array();
- $code[] = "ob_start();\n";
- $code[] = '$_tmp_data_exists = $_parser->DataExists;';
- $code[] = '$_parser->DataExists = false;';
- $this->AppendCode($o, $code);
- return $o;
- }
-
- function Close($tag)
- {
- $o = $this->Parser->Buffers[$this->Parser->Level];
- $code = array();
- $code[] = '$res = ob_get_clean();';
- $code[] = 'if ($_parser->DataExists) {echo $res;}';
- $code[] = '$_parser->DataExists = $_tmp_data_exists;';
-
- $this->AppendCode($o, $code);
- return $o;
- }
-
-}
\ No newline at end of file