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

Compiler.php

Zuletzt modifiziert: 09.10.2024, 12:57 - Dateigröße: 6.90 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 = array();
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      }
038   
039      public function getFilename()
040      {
041          return $this->filename;
042      }
043   
044      /**
045       * Returns the environment instance related to this compiler.
046       *
047       * @return Twig_Environment The environment instance
048       */
049      public function getEnvironment()
050      {
051          return $this->env;
052      }
053   
054      /**
055       * Gets the current PHP code after compilation.
056       *
057       * @return string The PHP code
058       */
059      public function getSource()
060      {
061          return $this->source;
062      }
063   
064      /**
065       * Compiles a node.
066       *
067       * @param Twig_NodeInterface $node        The node to compile
068       * @param int                $indentation The current indentation
069       *
070       * @return Twig_Compiler The current compiler instance
071       */
072      public function compile(Twig_NodeInterface $node, $indentation = 0)
073      {
074          $this->lastLine = null;
075          $this->source = '';
076          $this->debugInfo = array();
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              $first = true;
184              foreach ($value as $key => $v) {
185                  if (!$first) {
186                      $this->raw(', ');
187                  }
188                  $first = false;
189                  $this->repr($key);
190                  $this->raw(' => ');
191                  $this->repr($v);
192              }
193              $this->raw(')');
194          } else {
195              $this->string($value);
196          }
197   
198          return $this;
199      }
200   
201      /**
202       * Adds debugging information.
203       *
204       * @param Twig_NodeInterface $node The related twig node
205       *
206       * @return Twig_Compiler The current compiler instance
207       */
208      public function addDebugInfo(Twig_NodeInterface $node)
209      {
210          if ($node->getLine() != $this->lastLine) {
211              $this->write(sprintf("// line %d\n", $node->getLine()));
212   
213              // when mbstring.func_overload is set to 2
214              // mb_substr_count() replaces substr_count()
215              // but they have different signatures!
216              if (((int) ini_get('mbstring.func_overload')) & 2) {
217                  // this is much slower than the "right" version
218                  $this->sourceLine += mb_substr_count(mb_substr($this->source, $this->sourceOffset), "\n");
219              } else {
220                  $this->sourceLine += substr_count($this->source, "\n", $this->sourceOffset);
221              }
222              $this->sourceOffset = strlen($this->source);
223              $this->debugInfo[$this->sourceLine] = $node->getLine();
224   
225              $this->lastLine = $node->getLine();
226          }
227   
228          return $this;
229      }
230   
231      public function getDebugInfo()
232      {
233          ksort($this->debugInfo);
234   
235          return $this->debugInfo;
236      }
237   
238      /**
239       * Indents the generated code.
240       *
241       * @param int $step The number of indentation to add
242       *
243       * @return Twig_Compiler The current compiler instance
244       */
245      public function indent($step = 1)
246      {
247          $this->indentation += $step;
248   
249          return $this;
250      }
251   
252      /**
253       * Outdents the generated code.
254       *
255       * @param int $step The number of indentation to remove
256       *
257       * @return Twig_Compiler The current compiler instance
258       *
259       * @throws LogicException When trying to outdent too much so the indentation would become negative
260       */
261      public function outdent($step = 1)
262      {
263          // can't outdent by more steps than the current indentation level
264          if ($this->indentation < $step) {
265              throw new LogicException('Unable to call outdent() as the indentation would become negative');
266          }
267   
268          $this->indentation -= $step;
269   
270          return $this;
271      }
272   
273      public function getVarName()
274      {
275          return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false));
276      }
277  }
278