Index: branches/RC/core/kernel/nparser/ntags.php =================================================================== diff -u -N -r10740 -r11067 --- branches/RC/core/kernel/nparser/ntags.php (.../ntags.php) (revision 10740) +++ branches/RC/core/kernel/nparser/ntags.php (.../ntags.php) (revision 11067) @@ -159,6 +159,7 @@ $o = parent::Open($tag); $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';"; @@ -168,6 +169,7 @@ $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);"; @@ -179,13 +181,32 @@ 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 = $this->Tag['pos'] + $tag['pos'] + strlen($tag['opening']) + strlen($tag['tag']) + strlen($tag['closing']) + TAG_NAMESPACE_LENGTH; + $code[] = "\$_parser->ElementLocations['{$this->Tag['function_name']}'] = Array('file' => '{$this->Tag['file']}', 'start_pos' => {$this->Tag['pos']}, 'end_pos' => {$end_pos});"; + $this->AppendCode($o, $code); return $o; } @@ -260,13 +281,14 @@ $this->Single = false; $this->OriginalTag = $tag; $tag['NP']['name'] = '__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))));"; + $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); } @@ -277,6 +299,7 @@ } $o = parent::Close($tag); $this->OriginalTag['NP']['name'] = '__lambda'; + $this->RenderDesignCode($o, $this->OriginalTag['NP']); return $o; }