static function compileTemplate($tpl, $key, &$resourceData)
 {
     if (!eZTemplateCompiler::isCompilationEnabled()) {
         return false;
     }
     $resourceData['use-comments'] = eZTemplateCompiler::isCommentsEnabled();
     $cacheFileName = eZTemplateCompiler::compilationFilename($key, $resourceData);
     $resourceData['uniqid'] = md5($resourceData['template-filename'] . uniqid("ezp" . getmypid(), true));
     // Time limit #1:
     // We reset the time limit to 30 seconds to ensure that templates
     // have enough time to compile
     // However if time limit is unlimited (0) we leave it be
     // Time limit will also be reset after subtemplates are compiled
     $maxExecutionTime = ini_get('max_execution_time');
     if ($maxExecutionTime != 0 && $maxExecutionTime < 30) {
         @set_time_limit(30);
     }
     $rootNode =& $resourceData['root-node'];
     if (!$rootNode) {
         return false;
     }
     $GLOBALS['eZTemplateCompilerResourceCache'][$resourceData['template-filename']] =& $resourceData;
     $useComments = eZTemplateCompiler::isCommentsEnabled();
     if (!$resourceData['test-compile']) {
         eZTemplateCompiler::createCommonCompileTemplate();
     }
     /* Check if we need to disable the generation of spacing for the compiled templates */
     $ini = eZINI::instance();
     $spacing = 'disabled';
     if ($ini->variable('TemplateSettings', 'UseFormatting') == 'enabled') {
         $spacing = 'enabled';
     }
     $php = new eZPHPCreator(eZTemplateCompiler::compilationDirectory(), $cacheFileName, eZTemplateCompiler::TemplatePrefix(), array('spacing' => $spacing));
     $php->addComment('URI:       ' . $resourceData['uri']);
     $php->addComment('Filename:  ' . $resourceData['template-filename']);
     $php->addComment('Timestamp: ' . $resourceData['time-stamp'] . ' (' . date('D M j G:i:s T Y', $resourceData['time-stamp']) . ')');
     $php->addCodePiece("\$oldSetArray_{$resourceData['uniqid']} = isset( \$setArray ) ? \$setArray : array();\n" . "\$setArray = array();\n");
     // Code to decrement include level of the templates
     $php->addCodePiece("\$tpl->Level++;\n");
     $php->addCodePiece("if ( \$tpl->Level > {$tpl->MaxLevel} )\n" . "{\n" . "\$text = \$tpl->MaxLevelWarning;" . "\$tpl->Level--;\n" . "return;\n" . "}\n");
     if ($resourceData['locales'] && count($resourceData['locales'])) {
         $php->addComment('Locales:   ' . join(', ', $resourceData['locales']));
         $php->addCodePiece('$locales = array( "' . join('", "', $resourceData['locales']) . "\" );\n" . '$oldLocale_' . $resourceData['uniqid'] . ' = setlocale( LC_CTYPE, null );' . "\n" . '$currentLocale_' . $resourceData['uniqid'] . ' = setlocale( LC_CTYPE, $locales );' . "\n");
     }
     //         $php->addCodePiece( "print( \"" . $resourceData['template-filename'] . " ($cacheFileName)<br/>\n\" );" );
     if ($useComments) {
         $templateFilename = $resourceData['template-filename'];
         if (file_exists($templateFilename)) {
             $fd = fopen($templateFilename, 'rb');
             if ($fd) {
                 $templateText = fread($fd, filesize($templateFilename));
                 $php->addComment("Original code:\n" . $templateText);
                 fclose($fd);
             }
         }
     }
     $php->addVariable('eZTemplateCompilerCodeDate', eZTemplateCompiler::CODE_DATE);
     $php->addCodePiece("if ( !defined( 'EZ_TEMPLATE_COMPILER_COMMON_CODE' ) )\n");
     $php->addInclude(eZTemplateCompiler::compilationDirectory() . '/common.php', eZPHPCreator::INCLUDE_ONCE_STATEMENT, array('spacing' => 4));
     $php->addSpace();
     if (eZTemplateCompiler::isAccumulatorsEnabled()) {
         $php->addCodePiece("eZDebug::accumulatorStart( 'template_compiled_execution', 'template_total', 'Template compiled execution', true );\n");
     }
     if (eZTemplateCompiler::isTimingPointsEnabled()) {
         $php->addCodePiece("eZDebug::addTimingPoint( 'Script start {$cacheFileName}' );\n");
     }
     //         $php->addCodePiece( "if ( !isset( \$vars ) )\n    \$vars =& \$tpl->Variables;\n" );
     //         $php->addSpace();
     $parameters = array();
     $textName = eZTemplateCompiler::currentTextName($parameters);
     //         $php->addCodePiece( "if ( !isset( \$$textName ) )\n    \$$textName = '';\n" );
     //         $php->addSpace();
     //         $variableStats = array();
     //         eZTemplateCompiler::prepareVariableStatistics( $tpl, $resourceData, $variableStats );
     //         eZTemplateCompiler::calculateVariableStatistics( $tpl, $rootNode, $resourceData, $variableStats );
     //         print_r( $variableStats );
     $transformedTree = array();
     eZTemplateCompiler::processNodeTransformation($useComments, $php, $tpl, $rootNode, $resourceData, $transformedTree);
     if ($ini->variable('TemplateSettings', 'TemplateOptimization') == 'enabled') {
         /* Retrieve class information for the attribute lookup table */
         if (isset($resourceData['handler']->Keys) and isset($resourceData['handler']->Keys['class'])) {
             $resourceData['class-info'] = eZTemplateOptimizer::fetchClassDeclaration($resourceData['handler']->Keys['class']);
         }
         /* Run the optimizations */
         eZTemplateOptimizer::optimize($useComments, $php, $tpl, $transformedTree, $resourceData);
     }
     $staticTree = array();
     eZTemplateCompiler::processStaticOptimizations($useComments, $php, $tpl, $transformedTree, $resourceData, $staticTree);
     $combinedTree = array();
     eZTemplateCompiler::processNodeCombining($useComments, $php, $tpl, $staticTree, $resourceData, $combinedTree);
     $finalTree = $combinedTree;
     if (!eZTemplateCompiler::isNodePlacementEnabled()) {
         eZTemplateCompiler::processRemoveNodePlacement($finalTree);
     }
     eZTemplateCompiler::generatePHPCode($useComments, $php, $tpl, $finalTree, $resourceData);
     if (eZTemplateCompiler::isTreeEnabled('final')) {
         $php->addVariable('finalTree', $finalTree, eZPHPCreator::VARIABLE_ASSIGNMENT, array('full-tree' => true));
     }
     if (eZTemplateCompiler::isTreeEnabled('combined')) {
         $php->addVariable('combinedTree', $combinedTree, eZPHPCreator::VARIABLE_ASSIGNMENT, array('full-tree' => true));
     }
     if (eZTemplateCompiler::isTreeEnabled('static')) {
         $php->addVariable('staticTree', $staticTree, eZPHPCreator::VARIABLE_ASSIGNMENT, array('full-tree' => true));
     }
     if (eZTemplateCompiler::isTreeEnabled('transformed')) {
         $php->addVariable('transformedTree', $transformedTree, eZPHPCreator::VARIABLE_ASSIGNMENT, array('full-tree' => true));
     }
     if (eZTemplateCompiler::isTreeEnabled('original')) {
         $php->addVariable('originalTree', $rootNode, eZPHPCreator::VARIABLE_ASSIGNMENT, array('full-tree' => true));
     }
     if (eZTemplateCompiler::isTimingPointsEnabled()) {
         $php->addCodePiece("eZDebug::addTimingPoint( 'Script end {$cacheFileName}' );\n");
     }
     if (eZTemplateCompiler::isAccumulatorsEnabled()) {
         $php->addCodePiece("eZDebug::accumulatorStop( 'template_compiled_execution', true );\n");
     }
     if ($resourceData['locales'] && count($resourceData['locales'])) {
         $php->addCodePiece('setlocale( LC_CTYPE, $oldLocale_' . $resourceData['uniqid'] . ' );' . "\n");
     }
     $php->addCodePiece('$setArray = $oldSetArray_' . $resourceData['uniqid'] . ";\n");
     // Code to decrement include level of the templates
     $php->addCodePiece("\$tpl->Level--;\n");
     /*
     // dump names of all defined PHP variables
     $php->addCodePiece( "echo \"defined vars in $resourceData[uri]:<br/><pre>\\n\";\n" );
     $php->addCodePiece( 'foreach ( array_keys( get_defined_vars() ) as $var_name  ) echo "- $var_name\n";' );
     // dump tpl vars
     $php->addCodePiece( 'echo "\n-----------------------------------------------------------\nvars: ";' );
     $php->addCodePiece( 'var_dump( $vars );' );
     $php->addCodePiece( 'echo "</pre><hr/>\n";' );
     */
     if (!$resourceData['test-compile']) {
         $php->store(true);
     }
     return true;
 }
    static function optimize( $useComments, &$php, $tpl, &$tree, &$resourceData )
    {
        /* If for some reason we don't have elements, simply return */
        if (! is_array( $tree[1] ) )
            return;

        $addNodeInit = false;

        /* Loop through the children of the root */
        foreach ( $tree[1] as $key => $kiddie )
        {
            /* Analyse per node type */
            switch ( $kiddie[0] )
            {
                case eZTemplate::NODE_INTERNAL_OUTPUT_SPACING_INCREASE:
                case eZTemplate::NODE_INTERNAL_SPACING_DECREASE:
                    /* Removing unnecessary whitespace changes */
                    unset( $tree[1][$key] );
                    break;
                case 3: /* Variable */
                    if ( isset( $tree[1][$key + 1] ) and
                         ( $tree[1][$key + 1][0] == eZTemplate::NODE_INTERNAL_RESOURCE_ACQUISITION ) and
                         isset( $resourceData['class-info'] ) )
                    {
                        $ret = eZTemplateOptimizer::optimizeResourceAcquisition(
                            $useComments, $php, $tpl,
                            $tree[1][$key], $tree[1][$key + 1], $resourceData );
                        /* We only unset the tree node when the optimization
                         * function returns false, as that means that the
                         * optimization could not be made. */
                        if ($ret)
                        {
                            unset( $tree[1][$key] );
                        }
                    }
                    else
                    {
                        $ret = eZTemplateOptimizer::optimizeVariable( $useComments, $php, $tpl, $tree[1][$key][2], $resourceData );
                        if ( $ret & 1 )
                            $addNodeInit = true;
                    }
                    break;
            }
        }
        if ( $addNodeInit )
        {
            $initializer = array( eZTemplate::NODE_OPTIMIZED_INIT, null, false );
            array_unshift( $tree[1], $initializer );
        }
    }