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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
XmlReferenceDumper.php
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\Component\Config\Definition\Dumper;
013
014 use Symfony\Component\Config\Definition\ConfigurationInterface;
015 use Symfony\Component\Config\Definition\NodeInterface;
016 use Symfony\Component\Config\Definition\ArrayNode;
017 use Symfony\Component\Config\Definition\EnumNode;
018 use Symfony\Component\Config\Definition\PrototypedArrayNode;
019
020 /**
021 * Dumps a XML reference configuration for the given configuration/node instance.
022 *
023 * @author Wouter J <waldio.webdesign@gmail.com>
024 */
025 class XmlReferenceDumper
026 {
027 private $reference;
028
029 public function dump(ConfigurationInterface $configuration, $namespace = null)
030 {
031 return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree(), $namespace);
032 }
033
034 public function dumpNode(NodeInterface $node, $namespace = null)
035 {
036 $this->reference = '';
037 $this->writeNode($node, 0, true, $namespace);
038 $ref = $this->reference;
039 $this->reference = null;
040
041 return $ref;
042 }
043
044 /**
045 * @param NodeInterface $node
046 * @param int $depth
047 * @param bool $root If the node is the root node
048 * @param string $namespace The namespace of the node
049 */
050 private function writeNode(NodeInterface $node, $depth = 0, $root = false, $namespace = null)
051 {
052 $rootName = ($root ? 'config' : $node->getName());
053 $rootNamespace = ($namespace ?: ($root ? 'http://example.org/schema/dic/'.$node->getName() : null));
054
055 // xml remapping
056 if ($node->getParent()) {
057 $remapping = array_filter($node->getParent()->getXmlRemappings(), function ($mapping) use ($rootName) {
058 return $rootName === $mapping[1];
059 });
060
061 if (count($remapping)) {
062 list($singular) = current($remapping);
063 $rootName = $singular;
064 }
065 }
066 $rootName = str_replace('_', '-', $rootName);
067
068 $rootAttributes = array();
069 $rootAttributeComments = array();
070 $rootChildren = array();
071 $rootComments = array();
072
073 if ($node instanceof ArrayNode) {
074 $children = $node->getChildren();
075
076 // comments about the root node
077 if ($rootInfo = $node->getInfo()) {
078 $rootComments[] = $rootInfo;
079 }
080
081 if ($rootNamespace) {
082 $rootComments[] = 'Namespace: '.$rootNamespace;
083 }
084
085 // render prototyped nodes
086 if ($node instanceof PrototypedArrayNode) {
087 $prototype = $node->getPrototype();
088
089 $info = 'prototype';
090 if (null !== $prototype->getInfo()) {
091 $info .= ': '.$prototype->getInfo();
092 }
093 array_unshift($rootComments, $info);
094
095 if ($key = $node->getKeyAttribute()) {
096 $rootAttributes[$key] = str_replace('-', ' ', $rootName).' '.$key;
097 }
098
099 if ($prototype instanceof ArrayNode) {
100 $children = $prototype->getChildren();
101 } else {
102 if ($prototype->hasDefaultValue()) {
103 $prototypeValue = $prototype->getDefaultValue();
104 } else {
105 switch (get_class($prototype)) {
106 case 'Symfony\Component\Config\Definition\ScalarNode':
107 $prototypeValue = 'scalar value';
108 break;
109
110 case 'Symfony\Component\Config\Definition\FloatNode':
111 case 'Symfony\Component\Config\Definition\IntegerNode':
112 $prototypeValue = 'numeric value';
113 break;
114
115 case 'Symfony\Component\Config\Definition\BooleanNode':
116 $prototypeValue = 'true|false';
117 break;
118
119 case 'Symfony\Component\Config\Definition\EnumNode':
120 $prototypeValue = implode('|', array_map('json_encode', $prototype->getValues()));
121 break;
122
123 default:
124 $prototypeValue = 'value';
125 }
126 }
127 }
128 }
129
130 // get attributes and elements
131 foreach ($children as $child) {
132 if (!$child instanceof ArrayNode) {
133 // get attributes
134
135 // metadata
136 $name = str_replace('_', '-', $child->getName());
137 $value = '%%%%not_defined%%%%'; // use a string which isn't used in the normal world
138
139 // comments
140 $comments = array();
141 if ($info = $child->getInfo()) {
142 $comments[] = $info;
143 }
144
145 if ($example = $child->getExample()) {
146 $comments[] = 'Example: '.$example;
147 }
148
149 if ($child->isRequired()) {
150 $comments[] = 'Required';
151 }
152
153 if ($child instanceof EnumNode) {
154 $comments[] = 'One of '.implode('; ', array_map('json_encode', $child->getValues()));
155 }
156
157 if (count($comments)) {
158 $rootAttributeComments[$name] = implode(";\n", $comments);
159 }
160
161 // default values
162 if ($child->hasDefaultValue()) {
163 $value = $child->getDefaultValue();
164 }
165
166 // append attribute
167 $rootAttributes[$name] = $value;
168 } else {
169 // get elements
170 $rootChildren[] = $child;
171 }
172 }
173 }
174
175 // render comments
176
177 // root node comment
178 if (count($rootComments)) {
179 foreach ($rootComments as $comment) {
180 $this->writeLine('<!-- '.$comment.' -->', $depth);
181 }
182 }
183
184 // attribute comments
185 if (count($rootAttributeComments)) {
186 foreach ($rootAttributeComments as $attrName => $comment) {
187 $commentDepth = $depth + 4 + strlen($attrName) + 2;
188 $commentLines = explode("\n", $comment);
189 $multiline = (count($commentLines) > 1);
190 $comment = implode(PHP_EOL.str_repeat(' ', $commentDepth), $commentLines);
191
192 if ($multiline) {
193 $this->writeLine('<!--', $depth);
194 $this->writeLine($attrName.': '.$comment, $depth + 4);
195 $this->writeLine('-->', $depth);
196 } else {
197 $this->writeLine('<!-- '.$attrName.': '.$comment.' -->', $depth);
198 }
199 }
200 }
201
202 // render start tag + attributes
203 $rootIsVariablePrototype = isset($prototypeValue);
204 $rootIsEmptyTag = (0 === count($rootChildren) && !$rootIsVariablePrototype);
205 $rootOpenTag = '<'.$rootName;
206 if (1 >= ($attributesCount = count($rootAttributes))) {
207 if (1 === $attributesCount) {
208 $rootOpenTag .= sprintf(' %s="%s"', current(array_keys($rootAttributes)), $this->writeValue(current($rootAttributes)));
209 }
210
211 $rootOpenTag .= $rootIsEmptyTag ? ' />' : '>';
212
213 if ($rootIsVariablePrototype) {
214 $rootOpenTag .= $prototypeValue.'</'.$rootName.'>';
215 }
216
217 $this->writeLine($rootOpenTag, $depth);
218 } else {
219 $this->writeLine($rootOpenTag, $depth);
220
221 $i = 1;
222
223 foreach ($rootAttributes as $attrName => $attrValue) {
224 $attr = sprintf('%s="%s"', $attrName, $this->writeValue($attrValue));
225
226 $this->writeLine($attr, $depth + 4);
227
228 if ($attributesCount === $i++) {
229 $this->writeLine($rootIsEmptyTag ? '/>' : '>', $depth);
230
231 if ($rootIsVariablePrototype) {
232 $rootOpenTag .= $prototypeValue.'</'.$rootName.'>';
233 }
234 }
235 }
236 }
237
238 // render children tags
239 foreach ($rootChildren as $child) {
240 $this->writeLine('');
241 $this->writeNode($child, $depth + 4);
242 }
243
244 // render end tag
245 if (!$rootIsEmptyTag && !$rootIsVariablePrototype) {
246 $this->writeLine('');
247
248 $rootEndTag = '</'.$rootName.'>';
249 $this->writeLine($rootEndTag, $depth);
250 }
251 }
252
253 /**
254 * Outputs a single config reference line.
255 *
256 * @param string $text
257 * @param int $indent
258 */
259 private function writeLine($text, $indent = 0)
260 {
261 $indent = strlen($text) + $indent;
262 $format = '%'.$indent.'s';
263
264 $this->reference .= sprintf($format, $text).PHP_EOL;
265 }
266
267 /**
268 * Renders the string conversion of the value.
269 *
270 * @param mixed $value
271 *
272 * @return string
273 */
274 private function writeValue($value)
275 {
276 if ('%%%%not_defined%%%%' === $value) {
277 return '';
278 }
279
280 if (is_string($value) || is_numeric($value)) {
281 return $value;
282 }
283
284 if (false === $value) {
285 return 'false';
286 }
287
288 if (true === $value) {
289 return 'true';
290 }
291
292 if (null === $value) {
293 return 'null';
294 }
295
296 if (empty($value)) {
297 return '';
298 }
299
300 if (is_array($value)) {
301 return implode(',', $value);
302 }
303 }
304 }
305