Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

Module.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 12.70 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of Twig.
 005   *
 006   * (c) 2009 Fabien Potencier
 007   * (c) 2009 Armin Ronacher
 008   *
 009   * For the full copyright and license information, please view the LICENSE
 010   * file that was distributed with this source code.
 011   */
 012   
 013  /**
 014   * Represents a module node.
 015   *
 016   * Consider this class as being final. If you need to customize the behavior of
 017   * the generated class, consider adding nodes to the following nodes: display_start,
 018   * display_end, constructor_start, constructor_end, and class_end.
 019   *
 020   * @author Fabien Potencier <fabien@symfony.com>
 021   */
 022  class Twig_Node_Module extends Twig_Node
 023  {
 024      public function __construct(Twig_NodeInterface $body, Twig_Node_Expression $parent = null, Twig_NodeInterface $blocks, Twig_NodeInterface $macros, Twig_NodeInterface $traits, $embeddedTemplates, $filename)
 025      {
 026          // embedded templates are set as attributes so that they are only visited once by the visitors
 027          parent::__construct(array(
 028              'parent' => $parent,
 029              'body' => $body,
 030              'blocks' => $blocks,
 031              'macros' => $macros,
 032              'traits' => $traits,
 033              'display_start' => new Twig_Node(),
 034              'display_end' => new Twig_Node(),
 035              'constructor_start' => new Twig_Node(),
 036              'constructor_end' => new Twig_Node(),
 037              'class_end' => new Twig_Node(),
 038          ), array(
 039              'filename' => $filename,
 040              'index' => null,
 041              'embedded_templates' => $embeddedTemplates,
 042          ), 1);
 043      }
 044   
 045      public function setIndex($index)
 046      {
 047          $this->setAttribute('index', $index);
 048      }
 049   
 050      public function compile(Twig_Compiler $compiler)
 051      {
 052          $this->compileTemplate($compiler);
 053   
 054          foreach ($this->getAttribute('embedded_templates') as $template) {
 055              $compiler->subcompile($template);
 056          }
 057      }
 058   
 059      protected function compileTemplate(Twig_Compiler $compiler)
 060      {
 061          if (!$this->getAttribute('index')) {
 062              $compiler->write('<?php');
 063          }
 064   
 065          $this->compileClassHeader($compiler);
 066   
 067          if (
 068              count($this->getNode('blocks'))
 069              || count($this->getNode('traits'))
 070              || null === $this->getNode('parent')
 071              || $this->getNode('parent') instanceof Twig_Node_Expression_Constant
 072              || count($this->getNode('constructor_start'))
 073              || count($this->getNode('constructor_end'))
 074          ) {
 075              $this->compileConstructor($compiler);
 076          }
 077   
 078          $this->compileGetParent($compiler);
 079   
 080          $this->compileDisplay($compiler);
 081   
 082          $compiler->subcompile($this->getNode('blocks'));
 083   
 084          $this->compileMacros($compiler);
 085   
 086          $this->compileGetTemplateName($compiler);
 087   
 088          $this->compileIsTraitable($compiler);
 089   
 090          $this->compileDebugInfo($compiler);
 091   
 092          $this->compileClassFooter($compiler);
 093      }
 094   
 095      protected function compileGetParent(Twig_Compiler $compiler)
 096      {
 097          if (null === $parent = $this->getNode('parent')) {
 098              return;
 099          }
 100   
 101          $compiler
 102              ->write("protected function doGetParent(array \$context)\n", "{\n")
 103              ->indent()
 104              ->addDebugInfo($parent)
 105              ->write('return ')
 106          ;
 107   
 108          if ($parent instanceof Twig_Node_Expression_Constant) {
 109              $compiler->subcompile($parent);
 110          } else {
 111              $compiler
 112                  ->raw('$this->loadTemplate(')
 113                  ->subcompile($parent)
 114                  ->raw(', ')
 115                  ->repr($compiler->getFilename())
 116                  ->raw(', ')
 117                  ->repr($this->getNode('parent')->getLine())
 118                  ->raw(')')
 119              ;
 120          }
 121   
 122          $compiler
 123              ->raw(";\n")
 124              ->outdent()
 125              ->write("}\n\n")
 126          ;
 127      }
 128   
 129      protected function compileClassHeader(Twig_Compiler $compiler)
 130      {
 131          $compiler
 132              ->write("\n\n")
 133              // if the filename contains */, add a blank to avoid a PHP parse error
 134              ->write('/* '.str_replace('*/', '* /', $this->getAttribute('filename'))." */\n")
 135              ->write('class '.$compiler->getEnvironment()->getTemplateClass($this->getAttribute('filename'), $this->getAttribute('index')))
 136              ->raw(sprintf(" extends %s\n", $compiler->getEnvironment()->getBaseTemplateClass()))
 137              ->write("{\n")
 138              ->indent()
 139          ;
 140      }
 141   
 142      protected function compileConstructor(Twig_Compiler $compiler)
 143      {
 144          $compiler
 145              ->write("public function __construct(Twig_Environment \$env)\n", "{\n")
 146              ->indent()
 147              ->subcompile($this->getNode('constructor_start'))
 148              ->write("parent::__construct(\$env);\n\n")
 149          ;
 150   
 151          // parent
 152          if (null === $parent = $this->getNode('parent')) {
 153              $compiler->write("\$this->parent = false;\n\n");
 154          } elseif ($parent instanceof Twig_Node_Expression_Constant) {
 155              $compiler
 156                  ->addDebugInfo($parent)
 157                  ->write('$this->parent = $this->loadTemplate(')
 158                  ->subcompile($parent)
 159                  ->raw(', ')
 160                  ->repr($compiler->getFilename())
 161                  ->raw(', ')
 162                  ->repr($this->getNode('parent')->getLine())
 163                  ->raw(");\n")
 164              ;
 165          }
 166   
 167          $countTraits = count($this->getNode('traits'));
 168          if ($countTraits) {
 169              // traits
 170              foreach ($this->getNode('traits') as $i => $trait) {
 171                  $this->compileLoadTemplate($compiler, $trait->getNode('template'), sprintf('$_trait_%s', $i));
 172   
 173                  $compiler
 174                      ->addDebugInfo($trait->getNode('template'))
 175                      ->write(sprintf("if (!\$_trait_%s->isTraitable()) {\n", $i))
 176                      ->indent()
 177                      ->write("throw new Twig_Error_Runtime('Template \"'.")
 178                      ->subcompile($trait->getNode('template'))
 179                      ->raw(".'\" cannot be used as a trait.');\n")
 180                      ->outdent()
 181                      ->write("}\n")
 182                      ->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->getBlocks();\n\n", $i, $i))
 183                  ;
 184   
 185                  foreach ($trait->getNode('targets') as $key => $value) {
 186                      $compiler
 187                          ->write(sprintf('if (!isset($_trait_%s_blocks[', $i))
 188                          ->string($key)
 189                          ->raw("])) {\n")
 190                          ->indent()
 191                          ->write("throw new Twig_Error_Runtime(sprintf('Block ")
 192                          ->string($key)
 193                          ->raw(' is not defined in trait ')
 194                          ->subcompile($trait->getNode('template'))
 195                          ->raw(".'));\n")
 196                          ->outdent()
 197                          ->write("}\n\n")
 198   
 199                          ->write(sprintf('$_trait_%s_blocks[', $i))
 200                          ->subcompile($value)
 201                          ->raw(sprintf('] = $_trait_%s_blocks[', $i))
 202                          ->string($key)
 203                          ->raw(sprintf(']; unset($_trait_%s_blocks[', $i))
 204                          ->string($key)
 205                          ->raw("]);\n\n")
 206                      ;
 207                  }
 208              }
 209   
 210              if ($countTraits > 1) {
 211                  $compiler
 212                      ->write("\$this->traits = array_merge(\n")
 213                      ->indent()
 214                  ;
 215   
 216                  for ($i = 0; $i < $countTraits; ++$i) {
 217                      $compiler
 218                          ->write(sprintf('$_trait_%s_blocks'.($i == $countTraits - 1 ? '' : ',')."\n", $i))
 219                      ;
 220                  }
 221   
 222                  $compiler
 223                      ->outdent()
 224                      ->write(");\n\n")
 225                  ;
 226              } else {
 227                  $compiler
 228                      ->write("\$this->traits = \$_trait_0_blocks;\n\n")
 229                  ;
 230              }
 231   
 232              $compiler
 233                  ->write("\$this->blocks = array_merge(\n")
 234                  ->indent()
 235                  ->write("\$this->traits,\n")
 236                  ->write("array(\n")
 237              ;
 238          } else {
 239              $compiler
 240                  ->write("\$this->blocks = array(\n")
 241              ;
 242          }
 243   
 244          // blocks
 245          $compiler
 246              ->indent()
 247          ;
 248   
 249          foreach ($this->getNode('blocks') as $name => $node) {
 250              $compiler
 251                  ->write(sprintf("'%s' => array(\$this, 'block_%s'),\n", $name, $name))
 252              ;
 253          }
 254   
 255          if ($countTraits) {
 256              $compiler
 257                  ->outdent()
 258                  ->write(")\n")
 259              ;
 260          }
 261   
 262          $compiler
 263              ->outdent()
 264              ->write(");\n")
 265              ->outdent()
 266              ->subcompile($this->getNode('constructor_end'))
 267              ->write("}\n\n")
 268          ;
 269      }
 270   
 271      protected function compileDisplay(Twig_Compiler $compiler)
 272      {
 273          $compiler
 274              ->write("protected function doDisplay(array \$context, array \$blocks = array())\n", "{\n")
 275              ->indent()
 276              ->subcompile($this->getNode('display_start'))
 277              ->subcompile($this->getNode('body'))
 278          ;
 279   
 280          if (null !== $parent = $this->getNode('parent')) {
 281              $compiler->addDebugInfo($parent);
 282              if ($parent instanceof Twig_Node_Expression_Constant) {
 283                  $compiler->write('$this->parent');
 284              } else {
 285                  $compiler->write('$this->getParent($context)');
 286              }
 287              $compiler->raw("->display(\$context, array_merge(\$this->blocks, \$blocks));\n");
 288          }
 289   
 290          $compiler
 291              ->subcompile($this->getNode('display_end'))
 292              ->outdent()
 293              ->write("}\n\n")
 294          ;
 295      }
 296   
 297      protected function compileClassFooter(Twig_Compiler $compiler)
 298      {
 299          $compiler
 300              ->subcompile($this->getNode('class_end'))
 301              ->outdent()
 302              ->write("}\n")
 303          ;
 304      }
 305   
 306      protected function compileMacros(Twig_Compiler $compiler)
 307      {
 308          $compiler->subcompile($this->getNode('macros'));
 309      }
 310   
 311      protected function compileGetTemplateName(Twig_Compiler $compiler)
 312      {
 313          $compiler
 314              ->write("public function getTemplateName()\n", "{\n")
 315              ->indent()
 316              ->write('return ')
 317              ->repr($this->getAttribute('filename'))
 318              ->raw(";\n")
 319              ->outdent()
 320              ->write("}\n\n")
 321          ;
 322      }
 323   
 324      protected function compileIsTraitable(Twig_Compiler $compiler)
 325      {
 326          // A template can be used as a trait if:
 327          //   * it has no parent
 328          //   * it has no macros
 329          //   * it has no body
 330          //
 331          // Put another way, a template can be used as a trait if it
 332          // only contains blocks and use statements.
 333          $traitable = null === $this->getNode('parent') && 0 === count($this->getNode('macros'));
 334          if ($traitable) {
 335              if ($this->getNode('body') instanceof Twig_Node_Body) {
 336                  $nodes = $this->getNode('body')->getNode(0);
 337              } else {
 338                  $nodes = $this->getNode('body');
 339              }
 340   
 341              if (!count($nodes)) {
 342                  $nodes = new Twig_Node(array($nodes));
 343              }
 344   
 345              foreach ($nodes as $node) {
 346                  if (!count($node)) {
 347                      continue;
 348                  }
 349   
 350                  if ($node instanceof Twig_Node_Text && ctype_space($node->getAttribute('data'))) {
 351                      continue;
 352                  }
 353   
 354                  if ($node instanceof Twig_Node_BlockReference) {
 355                      continue;
 356                  }
 357   
 358                  $traitable = false;
 359                  break;
 360              }
 361          }
 362   
 363          if ($traitable) {
 364              return;
 365          }
 366   
 367          $compiler
 368              ->write("public function isTraitable()\n", "{\n")
 369              ->indent()
 370              ->write(sprintf("return %s;\n", $traitable ? 'true' : 'false'))
 371              ->outdent()
 372              ->write("}\n\n")
 373          ;
 374      }
 375   
 376      protected function compileDebugInfo(Twig_Compiler $compiler)
 377      {
 378          $compiler
 379              ->write("public function getDebugInfo()\n", "{\n")
 380              ->indent()
 381              ->write(sprintf("return %s;\n", str_replace("\n", '', var_export(array_reverse($compiler->getDebugInfo(), true), true))))
 382              ->outdent()
 383              ->write("}\n")
 384          ;
 385      }
 386   
 387      protected function compileLoadTemplate(Twig_Compiler $compiler, $node, $var)
 388      {
 389          if ($node instanceof Twig_Node_Expression_Constant) {
 390              $compiler
 391                  ->write(sprintf('%s = $this->loadTemplate(', $var))
 392                  ->subcompile($node)
 393                  ->raw(', ')
 394                  ->repr($compiler->getFilename())
 395                  ->raw(', ')
 396                  ->repr($node->getLine())
 397                  ->raw(");\n")
 398              ;
 399          } else {
 400              throw new LogicException('Trait templates can only be constant nodes');
 401          }
 402      }
 403  }
 404