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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
PHP.php
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 }