Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

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

Compiler.php

Zuletzt modifiziert: 09.10.2024, 12:57 - Dateigröße: 6.58 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   * Compiles a node to PHP code.
 015   *
 016   * @author Fabien Potencier <fabien@symfony.com>
 017   */
 018  class Twig_Compiler implements Twig_CompilerInterface
 019  {
 020      protected $lastLine;
 021      protected $source;
 022      protected $indentation;
 023      protected $env;
 024      protected $debugInfo;
 025      protected $sourceOffset;
 026      protected $sourceLine;
 027      protected $filename;
 028   
 029      /**
 030       * Constructor.
 031       *
 032       * @param Twig_Environment $env The twig environment instance
 033       */
 034      public function __construct(Twig_Environment $env)
 035      {
 036          $this->env = $env;
 037          $this->debugInfo = array();
 038      }
 039   
 040      public function getFilename()
 041      {
 042          return $this->filename;
 043      }
 044   
 045      /**
 046       * Returns the environment instance related to this compiler.
 047       *
 048       * @return Twig_Environment The environment instance
 049       */
 050      public function getEnvironment()
 051      {
 052          return $this->env;
 053      }
 054   
 055      /**
 056       * Gets the current PHP code after compilation.
 057       *
 058       * @return string The PHP code
 059       */
 060      public function getSource()
 061      {
 062          return $this->source;
 063      }
 064   
 065      /**
 066       * Compiles a node.
 067       *
 068       * @param Twig_NodeInterface $node        The node to compile
 069       * @param integer            $indentation The current indentation
 070       *
 071       * @return Twig_Compiler The current compiler instance
 072       */
 073      public function compile(Twig_NodeInterface $node, $indentation = 0)
 074      {
 075          $this->lastLine = null;
 076          $this->source = '';
 077          $this->sourceOffset = 0;
 078          // source code starts at 1 (as we then increment it when we encounter new lines)
 079          $this->sourceLine = 1;
 080          $this->indentation = $indentation;
 081   
 082          if ($node instanceof Twig_Node_Module) {
 083              $this->filename = $node->getAttribute('filename');
 084          }
 085   
 086          $node->compile($this);
 087   
 088          return $this;
 089      }
 090   
 091      public function subcompile(Twig_NodeInterface $node, $raw = true)
 092      {
 093          if (false === $raw) {
 094              $this->addIndentation();
 095          }
 096   
 097          $node->compile($this);
 098   
 099          return $this;
 100      }
 101   
 102      /**
 103       * Adds a raw string to the compiled code.
 104       *
 105       * @param string $string The string
 106       *
 107       * @return Twig_Compiler The current compiler instance
 108       */
 109      public function raw($string)
 110      {
 111          $this->source .= $string;
 112   
 113          return $this;
 114      }
 115   
 116      /**
 117       * Writes a string to the compiled code by adding indentation.
 118       *
 119       * @return Twig_Compiler The current compiler instance
 120       */
 121      public function write()
 122      {
 123          $strings = func_get_args();
 124          foreach ($strings as $string) {
 125              $this->addIndentation();
 126              $this->source .= $string;
 127          }
 128   
 129          return $this;
 130      }
 131   
 132      /**
 133       * Appends an indentation to the current PHP code after compilation.
 134       *
 135       * @return Twig_Compiler The current compiler instance
 136       */
 137      public function addIndentation()
 138      {
 139          $this->source .= str_repeat(' ', $this->indentation * 4);
 140   
 141          return $this;
 142      }
 143   
 144      /**
 145       * Adds a quoted string to the compiled code.
 146       *
 147       * @param string $value The string
 148       *
 149       * @return Twig_Compiler The current compiler instance
 150       */
 151      public function string($value)
 152      {
 153          $this->source .= sprintf('"%s"', addcslashes($value, "\0\t\"\$\\"));
 154   
 155          return $this;
 156      }
 157   
 158      /**
 159       * Returns a PHP representation of a given value.
 160       *
 161       * @param mixed $value The value to convert
 162       *
 163       * @return Twig_Compiler The current compiler instance
 164       */
 165      public function repr($value)
 166      {
 167          if (is_int($value) || is_float($value)) {
 168              if (false !== $locale = setlocale(LC_NUMERIC, 0)) {
 169                  setlocale(LC_NUMERIC, 'C');
 170              }
 171   
 172              $this->raw($value);
 173   
 174              if (false !== $locale) {
 175                  setlocale(LC_NUMERIC, $locale);
 176              }
 177          } elseif (null === $value) {
 178              $this->raw('null');
 179          } elseif (is_bool($value)) {
 180              $this->raw($value ? 'true' : 'false');
 181          } elseif (is_array($value)) {
 182              $this->raw('array(');
 183              $i = 0;
 184              foreach ($value as $key => $value) {
 185                  if ($i++) {
 186                      $this->raw(', ');
 187                  }
 188                  $this->repr($key);
 189                  $this->raw(' => ');
 190                  $this->repr($value);
 191              }
 192              $this->raw(')');
 193          } else {
 194              $this->string($value);
 195          }
 196   
 197          return $this;
 198      }
 199   
 200      /**
 201       * Adds debugging information.
 202       *
 203       * @param Twig_NodeInterface $node The related twig node
 204       *
 205       * @return Twig_Compiler The current compiler instance
 206       */
 207      public function addDebugInfo(Twig_NodeInterface $node)
 208      {
 209          if ($node->getLine() != $this->lastLine) {
 210              $this->write("// line {$node->getLine()}\n");
 211   
 212              // when mbstring.func_overload is set to 2
 213              // mb_substr_count() replaces substr_count()
 214              // but they have different signatures!
 215              if (((int) ini_get('mbstring.func_overload')) & 2) {
 216                  // this is much slower than the "right" version
 217                  $this->sourceLine += mb_substr_count(mb_substr($this->source, $this->sourceOffset), "\n");
 218              } else {
 219                  $this->sourceLine += substr_count($this->source, "\n", $this->sourceOffset);
 220              }
 221              $this->sourceOffset = strlen($this->source);
 222              $this->debugInfo[$this->sourceLine] = $node->getLine();
 223   
 224              $this->lastLine = $node->getLine();
 225          }
 226   
 227          return $this;
 228      }
 229   
 230      public function getDebugInfo()
 231      {
 232          return $this->debugInfo;
 233      }
 234   
 235      /**
 236       * Indents the generated code.
 237       *
 238       * @param integer $step The number of indentation to add
 239       *
 240       * @return Twig_Compiler The current compiler instance
 241       */
 242      public function indent($step = 1)
 243      {
 244          $this->indentation += $step;
 245   
 246          return $this;
 247      }
 248   
 249      /**
 250       * Outdents the generated code.
 251       *
 252       * @param integer $step The number of indentation to remove
 253       *
 254       * @return Twig_Compiler The current compiler instance
 255       */
 256      public function outdent($step = 1)
 257      {
 258          // can't outdent by more steps than the current indentation level
 259          if ($this->indentation < $step) {
 260              throw new LogicException('Unable to call outdent() as the indentation would become negative');
 261          }
 262   
 263          $this->indentation -= $step;
 264   
 265          return $this;
 266      }
 267  }
 268