Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

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

PHP.php

Zuletzt modifiziert: 02.04.2025, 15:04 - Dateigröße: 6.00 KiB


001  <?php
002   
003  /**
004  * @package   s9e\TextFormatter
005  * @copyright Copyright (c) 2010-2022 The s9e authors
006  * @license   http://www.opensource.org/licenses/mit-license.php The MIT License
007  */
008  namespace s9e\TextFormatter\Configurator\RendererGenerators;
009   
010  use DOMElement;
011  use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
012  use s9e\TextFormatter\Configurator\Helpers\TemplateParser;
013  use s9e\TextFormatter\Configurator\RendererGenerator;
014  use s9e\TextFormatter\Configurator\RendererGenerators\PHP\ControlStructuresOptimizer;
015  use s9e\TextFormatter\Configurator\RendererGenerators\PHP\Optimizer;
016  use s9e\TextFormatter\Configurator\RendererGenerators\PHP\Quick;
017  use s9e\TextFormatter\Configurator\RendererGenerators\PHP\Serializer;
018  use s9e\TextFormatter\Configurator\RendererGenerators\PHP\SwitchStatement;
019  use s9e\TextFormatter\Configurator\Rendering;
020  use s9e\TextFormatter\Configurator\TemplateNormalizer;
021   
022  class PHP implements RendererGenerator
023  {
024      /**
025      * XSL namespace
026      */
027      const XMLNS_XSL = 'http://www.w3.org/1999/XSL/Transform';
028   
029      /**
030      * @var string Directory where the renderer's source is automatically saved if set, and if filepath is not set
031      */
032      public $cacheDir;
033   
034      /**
035      * @var string Name of the class to be created. If null, a random name will be generated
036      */
037      public $className;
038   
039      /**
040      * @var ControlStructuresOptimizer Control structures optimizer
041      */
042      public $controlStructuresOptimizer;
043   
044      /**
045      * @var string Prefix used when generating a default class name
046      */
047      public $defaultClassPrefix = 'Renderer_';
048   
049      /**
050      * @var bool Whether to enable the Quick renderer
051      */
052      public $enableQuickRenderer = true;
053   
054      /**
055      * @var string If set, path to the file where the renderer will be saved
056      */
057      public $filepath;
058   
059      /**
060      * @var string Name of the last class generated
061      */
062      public $lastClassName;
063   
064      /**
065      * @var string Path to the last file saved
066      */
067      public $lastFilepath;
068   
069      /**
070      * @var TemplateNormalizer
071      */
072      protected $normalizer;
073   
074      /**
075      * @var Optimizer Optimizer
076      */
077      public $optimizer;
078   
079      /**
080      * @var string File header
081      */
082      public $phpHeader = '/**
083  * @package   s9e\TextFormatter
084  * @copyright Copyright (c) 2010-2022 The s9e authors
085  * @license   http://www.opensource.org/licenses/mit-license.php The MIT License
086  */';
087   
088      /**
089      * @var Serializer Serializer
090      */
091      public $serializer;
092   
093      /**
094      * Constructor
095      *
096      * @param string $cacheDir If set, path to the directory where the renderer will be saved
097      */
098      public function __construct($cacheDir = null)
099      {
100          $this->cacheDir = $cacheDir ?? sys_get_temp_dir();
101          if (extension_loaded('tokenizer'))
102          {
103              $this->controlStructuresOptimizer = new ControlStructuresOptimizer;
104              $this->optimizer = new Optimizer;
105          }
106          $this->serializer = new Serializer;
107          $this->normalizer = new TemplateNormalizer(['RemoveLivePreviewAttributes']);
108      }
109   
110      /**
111      * {@inheritdoc}
112      */
113      public function getRenderer(Rendering $rendering)
114      {
115          // Generate the source file
116          $php = $this->generate($rendering);
117   
118          // Save the file if applicable
119          if (isset($this->filepath))
120          {
121              $filepath = $this->filepath;
122          }
123          else
124          {
125              $filepath = $this->cacheDir . '/' . str_replace('\\', '_', $this->lastClassName) . '.php';
126          }
127   
128          file_put_contents($filepath, "<?php\n" . $php);
129          $this->lastFilepath = realpath($filepath);
130   
131          // Execute the source to create the class if it doesn't exist
132          if (!class_exists($this->lastClassName, false))
133          {
134              include $filepath;
135          }
136   
137          return new $this->lastClassName;
138      }
139   
140      /**
141      * Generate the source for a PHP class that renders an intermediate representation according to
142      * given rendering configuration
143      *
144      * @param  Rendering $rendering
145      * @return string
146      */
147      public function generate(Rendering $rendering)
148      {
149          // Compile the templates to PHP
150          $compiledTemplates = array_map([$this, 'compileTemplate'], $rendering->getTemplates());
151   
152          // Start the code right after the class name, we'll prepend the header when we're done
153          $php = [];
154          $php[] = ' extends \\s9e\\TextFormatter\\Renderers\\PHP';
155          $php[] = '{';
156          $php[] = '    protected $params=' . self::export($rendering->getAllParameters()) . ';';
157          $php[] = '    protected function renderNode(\\DOMNode $node)';
158          $php[] = '    {';
159          $php[] = '        ' . SwitchStatement::generate('$node->nodeName', $compiledTemplates, '$this->at($node);');
160          $php[] = '    }';
161   
162          // Append the Quick renderer if applicable
163          if ($this->enableQuickRenderer)
164          {
165              $php[] = Quick::getSource($compiledTemplates);
166          }
167   
168          // Close the class definition
169          $php[] = '}';
170   
171          // Assemble the source
172          $php = implode("\n", $php);
173   
174          // Finally, optimize the control structures
175          if (isset($this->controlStructuresOptimizer))
176          {
177              $php = $this->controlStructuresOptimizer->optimize($php);
178          }
179   
180          // Generate a name for that class if necessary, and save it
181          $className = (isset($this->className))
182                     ? $this->className
183                     : $this->defaultClassPrefix . sha1($php);
184          $this->lastClassName = $className;
185   
186          // Prepare the header
187          $header = "\n" . $this->phpHeader . "\n";
188   
189          // Declare the namespace and class name
190          $pos = strrpos($className, '\\');
191          if ($pos !== false)
192          {
193              $header .= 'namespace ' . substr($className, 0, $pos) . ";\n\n";
194              $className = substr($className, 1 + $pos);
195          }
196   
197          // Prepend the header and the class name
198          $php = $header . 'class ' . $className . $php;
199   
200          return $php;
201      }
202   
203      /**
204      * Export given array as PHP code
205      *
206      * @param  array  $value Original value
207      * @return string        PHP code
208      */
209      protected static function export(array $value)
210      {
211          $pairs = [];
212          foreach ($value as $k => $v)
213          {
214              $pairs[] = var_export($k, true) . '=>' . var_export($v, true);
215          }
216   
217          return '[' . implode(',', $pairs) . ']';
218      }
219   
220      /**
221      * Compile a template to PHP
222      *
223      * @param  string $template Original template
224      * @return string           Compiled template
225      */
226      protected function compileTemplate($template)
227      {
228          $template = $this->normalizer->normalizeTemplate($template);
229   
230          // Parse the template
231          $ir = TemplateParser::parse($template);
232   
233          // Serialize the representation to PHP
234          $php = $this->serializer->serialize($ir->documentElement);
235          if (isset($this->optimizer))
236          {
237              $php = $this->optimizer->optimize($php);
238          }
239   
240          return $php;
241      }
242  }