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

CodeExtension.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 8.17 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Bridge\Twig\Extension;
013   
014  /**
015   * Twig extension relate to PHP code and used by the profiler and the default exception templates.
016   *
017   * @author Fabien Potencier <fabien@symfony.com>
018   */
019  class CodeExtension extends \Twig_Extension
020  {
021      private $fileLinkFormat;
022      private $rootDir;
023      private $charset;
024   
025      /**
026       * Constructor.
027       *
028       * @param string $fileLinkFormat The format for links to source files
029       * @param string $rootDir        The project root directory
030       * @param string $charset        The charset
031       */
032      public function __construct($fileLinkFormat, $rootDir, $charset)
033      {
034          $this->fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
035          $this->rootDir = str_replace('/', DIRECTORY_SEPARATOR, dirname($rootDir)).DIRECTORY_SEPARATOR;
036          $this->charset = $charset;
037      }
038   
039      /**
040       * {@inheritdoc}
041       */
042      public function getFilters()
043      {
044          return array(
045              new \Twig_SimpleFilter('abbr_class', array($this, 'abbrClass'), array('is_safe' => array('html'))),
046              new \Twig_SimpleFilter('abbr_method', array($this, 'abbrMethod'), array('is_safe' => array('html'))),
047              new \Twig_SimpleFilter('format_args', array($this, 'formatArgs'), array('is_safe' => array('html'))),
048              new \Twig_SimpleFilter('format_args_as_text', array($this, 'formatArgsAsText')),
049              new \Twig_SimpleFilter('file_excerpt', array($this, 'fileExcerpt'), array('is_safe' => array('html'))),
050              new \Twig_SimpleFilter('format_file', array($this, 'formatFile'), array('is_safe' => array('html'))),
051              new \Twig_SimpleFilter('format_file_from_text', array($this, 'formatFileFromText'), array('is_safe' => array('html'))),
052              new \Twig_SimpleFilter('file_link', array($this, 'getFileLink')),
053          );
054      }
055   
056      public function abbrClass($class)
057      {
058          $parts = explode('\\', $class);
059          $short = array_pop($parts);
060   
061          return sprintf('<abbr title="%s">%s</abbr>', $class, $short);
062      }
063   
064      public function abbrMethod($method)
065      {
066          if (false !== strpos($method, '::')) {
067              list($class, $method) = explode('::', $method, 2);
068              $result = sprintf('%s::%s()', $this->abbrClass($class), $method);
069          } elseif ('Closure' === $method) {
070              $result = sprintf('<abbr title="%s">%s</abbr>', $method, $method);
071          } else {
072              $result = sprintf('<abbr title="%s">%s</abbr>()', $method, $method);
073          }
074   
075          return $result;
076      }
077   
078      /**
079       * Formats an array as a string.
080       *
081       * @param array $args The argument array
082       *
083       * @return string
084       */
085      public function formatArgs($args)
086      {
087          $result = array();
088          foreach ($args as $key => $item) {
089              if ('object' === $item[0]) {
090                  $parts = explode('\\', $item[1]);
091                  $short = array_pop($parts);
092                  $formattedValue = sprintf('<em>object</em>(<abbr title="%s">%s</abbr>)', $item[1], $short);
093              } elseif ('array' === $item[0]) {
094                  $formattedValue = sprintf('<em>array</em>(%s)', is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
095              } elseif ('string' === $item[0]) {
096                  $formattedValue = sprintf("'%s'", htmlspecialchars($item[1], ENT_QUOTES, $this->charset));
097              } elseif ('null' === $item[0]) {
098                  $formattedValue = '<em>null</em>';
099              } elseif ('boolean' === $item[0]) {
100                  $formattedValue = '<em>'.strtolower(var_export($item[1], true)).'</em>';
101              } elseif ('resource' === $item[0]) {
102                  $formattedValue = '<em>resource</em>';
103              } else {
104                  $formattedValue = str_replace("\n", '', var_export(htmlspecialchars((string) $item[1], ENT_QUOTES, $this->charset), true));
105              }
106   
107              $result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue);
108          }
109   
110          return implode(', ', $result);
111      }
112   
113      /**
114       * Formats an array as a string.
115       *
116       * @param array $args The argument array
117       *
118       * @return string
119       */
120      public function formatArgsAsText($args)
121      {
122          return strip_tags($this->formatArgs($args));
123      }
124   
125      /**
126       * Returns an excerpt of a code file around the given line number.
127       *
128       * @param string $file A file path
129       * @param int    $line The selected line number
130       *
131       * @return string An HTML string
132       */
133      public function fileExcerpt($file, $line)
134      {
135          if (is_readable($file)) {
136              // highlight_file could throw warnings
137              // see https://bugs.php.net/bug.php?id=25725
138              $code = @highlight_file($file, true);
139              // remove main code/span tags
140              $code = preg_replace('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s', '\\1', $code);
141              $content = preg_split('#<br />#', $code);
142   
143              $lines = array();
144              for ($i = max($line - 3, 1), $max = min($line + 3, count($content)); $i <= $max; ++$i) {
145                  $lines[] = '<li'.($i == $line ? ' class="selected"' : '').'><code>'.self::fixCodeMarkup($content[$i - 1]).'</code></li>';
146              }
147   
148              return '<ol start="'.max($line - 3, 1).'">'.implode("\n", $lines).'</ol>';
149          }
150      }
151   
152      /**
153       * Formats a file path.
154       *
155       * @param string $file An absolute file path
156       * @param int    $line The line number
157       * @param string $text Use this text for the link rather than the file path
158       *
159       * @return string
160       */
161      public function formatFile($file, $line, $text = null)
162      {
163          $file = trim($file);
164   
165          if (null === $text) {
166              $text = str_replace('/', DIRECTORY_SEPARATOR, $file);
167              if (0 === strpos($text, $this->rootDir)) {
168                  $text = substr($text, strlen($this->rootDir));
169                  $text = explode(DIRECTORY_SEPARATOR, $text, 2);
170                  $text = sprintf('<abbr title="%s%2$s">%s</abbr>%s', $this->rootDir, $text[0], isset($text[1]) ? DIRECTORY_SEPARATOR.$text[1] : '');
171              }
172          }
173   
174          $text = "$text at line $line";
175   
176          if (false !== $link = $this->getFileLink($file, $line)) {
177              if (PHP_VERSION_ID >= 50400) {
178                  $flags = ENT_QUOTES | ENT_SUBSTITUTE;
179              } else {
180                  $flags = ENT_QUOTES;
181              }
182   
183              return sprintf('<a href="%s" title="Click to open this file" class="file_link">%s</a>', htmlspecialchars($link, $flags, $this->charset), $text);
184          }
185   
186          return $text;
187      }
188   
189      /**
190       * Returns the link for a given file/line pair.
191       *
192       * @param string $file An absolute file path
193       * @param int    $line The line number
194       *
195       * @return string A link of false
196       */
197      public function getFileLink($file, $line)
198      {
199          if ($this->fileLinkFormat && is_file($file)) {
200              return strtr($this->fileLinkFormat, array('%f' => $file, '%l' => $line));
201          }
202   
203          return false;
204      }
205   
206      public function formatFileFromText($text)
207      {
208          $that = $this;
209   
210          return preg_replace_callback('/in ("|&quot;)?(.+?)\1(?: +(?:on|at))? +line (\d+)/s', function ($match) use ($that) {
211              return 'in '.$that->formatFile($match[2], $match[3]);
212          }, $text);
213      }
214   
215      /**
216       * {@inheritdoc}
217       */
218      public function getName()
219      {
220          return 'code';
221      }
222   
223      protected static function fixCodeMarkup($line)
224      {
225          // </span> ending tag from previous line
226          $opening = strpos($line, '<span');
227          $closing = strpos($line, '</span>');
228          if (false !== $closing && (false === $opening || $closing < $opening)) {
229              $line = substr_replace($line, '', $closing, 7);
230          }
231   
232          // missing </span> tag at the end of line
233          $opening = strpos($line, '<span');
234          $closing = strpos($line, '</span>');
235          if (false !== $opening && (false === $closing || $closing > $opening)) {
236              $line .= '</span>';
237          }
238   
239          return $line;
240      }
241  }
242