00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 class eZTemplateSwitchFunction
00063 {
00064
00065
00066
00067 function eZTemplateSwitchFunction()
00068 {
00069 $this->SwitchName = 'switch';
00070 }
00071
00072
00073
00074
00075 function functionList()
00076 {
00077 return array( $this->SwitchName );
00078 }
00079
00080 function functionTemplateHints()
00081 {
00082 return array( $this->SwitchName => array( 'parameters' => true,
00083 'static' => false,
00084 'transform-children' => false,
00085 'tree-transformation' => true,
00086 'transform-parameters' => true ) );
00087 }
00088
00089
00090
00091
00092 function attributeList()
00093 {
00094 return array( "case" => true );
00095 }
00096
00097 function templateNodeCaseTransformation( &$tpl, &$newNodes, &$caseNodes, &$caseCounter, &$node, $privateData )
00098 {
00099 if ( $node[2] == 'case' )
00100 {
00101 if ( is_array( $node[3] ) && count( $node[3] ) )
00102 {
00103 if ( isset( $node[3]['match'] ) )
00104 {
00105 $match = $node[3]['match'];
00106 $match = eZTemplateCompiler::processElementTransformationList( $tpl, $node, $match, $privateData );
00107
00108 $dynamicCase = false;
00109 if ( eZTemplateNodeTool::isStaticElement( $match ) )
00110 {
00111 $matchValue = eZTemplateNodeTool::elementStaticValue( $match );
00112 $caseText = eZPHPCreator::variableText( $matchValue, 0, 0, false );
00113 }
00114 else
00115 {
00116 $newNodes[] = eZTemplateNodeTool::createVariableNode( false, $match, false, array(), 'case' . $caseCounter );
00117 $caseText = "\$case" . $caseCounter;
00118 ++$caseCounter;
00119 $dynamicCase = true;
00120 }
00121
00122 $caseNodes[] = eZTemplateNodeTool::createCodePieceNode( " case $caseText:\n {" );
00123 if ( $dynamicCase )
00124 $caseNodes[] = eZTemplateNodeTool::createCodePieceNode( " unset( $caseText );" );
00125 }
00126 else if ( isset( $node[3]['in'] ) )
00127 {
00128 return false;
00129 }
00130 }
00131 else
00132 {
00133 $caseNodes[] = eZTemplateNodeTool::createCodePieceNode( " default:\n {" );
00134 }
00135
00136 $children = eZTemplateNodeTool::extractFunctionNodeChildren( $node );
00137 $children = eZTemplateCompiler::processNodeTransformationNodes( $tpl, $node, $children, $privateData );
00138
00139 $caseNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode( 8 );
00140 $caseNodes = array_merge( $caseNodes, $children );
00141 $caseNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode( 8 );
00142
00143 $caseNodes[] = eZTemplateNodeTool::createCodePieceNode( " } break;" );
00144 }
00145 }
00146
00147
00148 function templateNodeTransformation( $functionName, &$node,
00149 &$tpl, $parameters, $privateData )
00150 {
00151 $newNodes = array();
00152 $namespaceValue = false;
00153 $varName = 'match';
00154
00155 if ( !isset( $parameters['match'] ) )
00156 {
00157 return false;
00158 }
00159
00160 if ( isset( $parameters['name'] ) )
00161 {
00162 $nameData = $parameters['name'];
00163 if ( !eZTemplateNodeTool::isStaticElement( $nameData ) )
00164 return false;
00165 $namespaceValue = eZTemplateNodeTool::elementStaticValue( $nameData );
00166 }
00167
00168 if ( isset( $parameters['var'] ) )
00169 {
00170 $varData = $parameters['var'];
00171 if ( !eZTemplateNodeTool::isStaticElement( $varData ) )
00172 return false;
00173 $varName = eZTemplateNodeTool::elementStaticValue( $varData );
00174 }
00175
00176 $newNodes[] = eZTemplateNodeTool::createVariableNode( false, $parameters['match'], false, array(),
00177 array( $namespaceValue, EZ_TEMPLATE_NAMESPACE_SCOPE_RELATIVE, $varName ) );
00178 $newNodes[] = eZTemplateNodeTool::createVariableNode( false, $parameters['match'],
00179 eZTemplateNodeTool::extractFunctionNodePlacement( $node ),
00180 array( 'variable-name' => 'match',
00181 'text-result' => true ), 'match' );
00182
00183 if ( isset( $parameters['name'] ) )
00184 {
00185 $newNodes[] = eZTemplateNodeTool::createNamespaceChangeNode( $parameters['name'] );
00186 }
00187
00188 $tmpNodes = array();
00189 $children = eZTemplateNodeTool::extractFunctionNodeChildren( $node );
00190 $caseNodes = array();
00191 $caseCounter = 1;
00192 if ( is_array( $children ) )
00193 {
00194 foreach ( $children as $child )
00195 {
00196 $childType = $child[0];
00197 if ( $childType == EZ_TEMPLATE_NODE_FUNCTION )
00198 {
00199 if ( $this->templateNodeCaseTransformation( $tpl, $tmpNodes, $caseNodes, $caseCounter, $child, $privateData ) === false )
00200 {
00201 return false;
00202 }
00203 }
00204 }
00205 }
00206 $newNodes = array_merge( $newNodes, $tmpNodes );
00207 $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "switch ( \$match )\n{" );
00208 $newNodes = array_merge( $newNodes, $caseNodes );
00209
00210 $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "}" );
00211 $newNodes[] = eZTemplateNodeTool::createVariableUnsetNode( 'match' );
00212 if ( isset( $parameters['name'] ) )
00213 {
00214 $newNodes[] = eZTemplateNodeTool::createNamespaceRestoreNode();
00215 }
00216 $newNodes[] = eZTemplateNodeTool::createVariableUnsetNode( array( $namespaceValue, EZ_TEMPLATE_NAMESPACE_SCOPE_RELATIVE, 'match' ) );
00217
00218 return $newNodes;
00219 }
00220
00221
00222
00223
00224 function process( &$tpl, &$textElements, $functionName, $functionChildren, $functionParameters, $functionPlacement, $rootNamespace, $currentNamespace )
00225 {
00226 $children = $functionChildren;
00227 $params = $functionParameters;
00228 $name = "";
00229 if ( isset( $params["name"] ) )
00230 $name = $tpl->elementValue( $params["name"], $rootNamespace, $currentNamespace, $functionPlacement );
00231 $varName = false;
00232 if ( isset( $params["var"] ) )
00233 $varName = $tpl->elementValue( $params["var"], $rootNamespace, $currentNamespace, $functionPlacement );
00234 if ( $currentNamespace != "" )
00235 {
00236 if ( $name != "" )
00237 $name = "$currentNamespace:$name";
00238 else
00239 $name = $currentNamespace;
00240 }
00241 if ( isset( $params["match"] ) )
00242 $match = $tpl->elementValue( $params["match"], $rootNamespace, $currentNamespace, $functionPlacement );
00243 else
00244 {
00245 $tpl->missingParameter( $this->SwitchName, "match" );
00246 return false;
00247 }
00248
00249 $items = array();
00250 $in_items = array();
00251 $def = null;
00252 $case = null;
00253 if ( is_array( $children ) )
00254 {
00255 foreach( $children as $child )
00256 {
00257 $childType = $child[0];
00258 if ( $childType == EZ_TEMPLATE_NODE_FUNCTION )
00259 {
00260 switch ( $child[2] )
00261 {
00262 case "case":
00263 {
00264 $child_params = $child[3];
00265 if ( isset( $child_params["match"] ) )
00266 {
00267 $child_match = $child_params["match"];
00268 $child_match = $tpl->elementValue( $child_match, $rootNamespace, $currentNamespace, $functionPlacement );
00269 if ( !isset( $items[$child_match] ) )
00270 {
00271 $items[$child_match] = $child;
00272 if ( is_null( $case ) and
00273 $match == $child_match )
00274 {
00275 $case = $child;
00276 }
00277 }
00278 else
00279 {
00280 $tpl->warning( $this->SwitchName, "Match value $child_match already set, skipping", $functionPlacement );
00281 }
00282 }
00283 else if ( isset( $child_params["in"] ) )
00284 {
00285 $key_name = null;
00286 if ( isset( $child_params["key"] ) )
00287 {
00288 $child_key = $child_params["key"];
00289 $key_name = $tpl->elementValue( $child_key, $rootNamespace, $currentNamespace, $functionPlacement );
00290 }
00291 $child_in = $child_params["in"];
00292 $child_in = $tpl->elementValue( $child_in, $rootNamespace, $currentNamespace, $functionPlacement );
00293 if ( !is_array( $child_in ) )
00294 break;
00295 if ( is_null( $case ) )
00296 {
00297 if ( is_null( $key_name ) )
00298 {
00299 if ( in_array( $match, $child_in ) )
00300 {
00301 $case = $child;
00302 }
00303 }
00304 else
00305 {
00306 foreach( $child_in as $child_in_element )
00307 {
00308 if ( !is_array( $key_name ) )
00309 $key_name_array = array( $key_name );
00310 else
00311 $key_name_array = $key_name;
00312 $child_value = $tpl->variableAttribute( $child_in_element, $key_name );
00313 if ( $child_value == $match )
00314 {
00315 $case = $child;
00316 break;
00317 }
00318 }
00319 }
00320 }
00321 }
00322 else
00323 {
00324 $def = $child;
00325 }
00326 } break;
00327 default:
00328 {
00329 $tpl->warning( $this->SwitchName, "Only case functions are allowed as children, found \""
00330 . $child[2] . "\"", $functionPlacement );
00331 } break;
00332 }
00333 }
00334 else if ( $childType == EZ_TEMPLATE_NODE_TEXT )
00335 {
00336
00337 }
00338 else
00339 {
00340 $tpl->warning( $this->SwitchName, "Only functions are allowed as children, found \""
00341 . $childType . "\"", $functionPlacement );
00342 }
00343 }
00344 }
00345
00346 if ( is_null( $case ) )
00347 {
00348 $case = $def;
00349 }
00350
00351 if ( $case !== null )
00352 {
00353 if ( $varName !== false )
00354 $tpl->setVariable( $varName, $match, $name );
00355 else
00356 $tpl->setVariable( "match", $match, $name );
00357 $case_children = $case[1];
00358 if ( $case_children )
00359 {
00360 foreach( $case_children as $case_child )
00361 {
00362 $tpl->processNode( $case_child, $textElements, $rootNamespace, $name );
00363 }
00364 }
00365 }
00366 else
00367 $tpl->warning( $this->SwitchName, "No case match and no default case", $functionPlacement );
00368 return;
00369 }
00370
00371
00372
00373
00374 function hasChildren()
00375 {
00376 return true;
00377 }
00378
00379
00380 var $SwitchName;
00381 }
00382
00383 ?>