Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

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

Inline.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 17.31 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\Component\Yaml;
013   
014  use Symfony\Component\Yaml\Exception\ParseException;
015  use Symfony\Component\Yaml\Exception\DumpException;
016   
017  /**
018   * Inline implements a YAML parser/dumper for the YAML inline syntax.
019   *
020   * @author Fabien Potencier <fabien@symfony.com>
021   */
022  class Inline
023  {
024      const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')';
025   
026      private static $exceptionOnInvalidType = false;
027      private static $objectSupport = false;
028   
029      /**
030       * Converts a YAML string to a PHP array.
031       *
032       * @param string  $value                  A YAML string
033       * @param bool    $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
034       * @param bool    $objectSupport          true if object support is enabled, false otherwise
035       * @param array   $references             Mapping of variable names to values
036       *
037       * @return array A PHP array representing the YAML string
038       *
039       * @throws ParseException
040       */
041      public static function parse($value, $exceptionOnInvalidType = false, $objectSupport = false, $references = array())
042      {
043          self::$exceptionOnInvalidType = $exceptionOnInvalidType;
044          self::$objectSupport = $objectSupport;
045   
046          $value = trim($value);
047   
048          if (0 == strlen($value)) {
049              return '';
050          }
051   
052          if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
053              $mbEncoding = mb_internal_encoding();
054              mb_internal_encoding('ASCII');
055          }
056   
057          $i = 0;
058          switch ($value[0]) {
059              case '[':
060                  $result = self::parseSequence($value, $i, $references);
061                  ++$i;
062                  break;
063              case '{':
064                  $result = self::parseMapping($value, $i, $references);
065                  ++$i;
066                  break;
067              default:
068                  $result = self::parseScalar($value, null, array('"', "'"), $i, true, $references);
069          }
070   
071          // some comments are allowed at the end
072          if (preg_replace('/\s+#.*$/A', '', substr($value, $i))) {
073              throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)));
074          }
075   
076          if (isset($mbEncoding)) {
077              mb_internal_encoding($mbEncoding);
078          }
079   
080          return $result;
081      }
082   
083      /**
084       * Dumps a given PHP variable to a YAML string.
085       *
086       * @param mixed   $value                  The PHP variable to convert
087       * @param bool    $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
088       * @param bool    $objectSupport          true if object support is enabled, false otherwise
089       *
090       * @return string The YAML string representing the PHP array
091       *
092       * @throws DumpException When trying to dump PHP resource
093       */
094      public static function dump($value, $exceptionOnInvalidType = false, $objectSupport = false)
095      {
096          switch (true) {
097              case is_resource($value):
098                  if ($exceptionOnInvalidType) {
099                      throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
100                  }
101   
102                  return 'null';
103              case is_object($value):
104                  if ($objectSupport) {
105                      return '!!php/object:'.serialize($value);
106                  }
107   
108                  if ($exceptionOnInvalidType) {
109                      throw new DumpException('Object support when dumping a YAML file has been disabled.');
110                  }
111   
112                  return 'null';
113              case is_array($value):
114                  return self::dumpArray($value, $exceptionOnInvalidType, $objectSupport);
115              case null === $value:
116                  return 'null';
117              case true === $value:
118                  return 'true';
119              case false === $value:
120                  return 'false';
121              case ctype_digit($value):
122                  return is_string($value) ? "'$value'" : (int) $value;
123              case is_numeric($value):
124                  $locale = setlocale(LC_NUMERIC, 0);
125                  if (false !== $locale) {
126                      setlocale(LC_NUMERIC, 'C');
127                  }
128                  $repr = is_string($value) ? "'$value'" : (is_infinite($value) ? str_ireplace('INF', '.Inf', strval($value)) : strval($value));
129   
130                  if (false !== $locale) {
131                      setlocale(LC_NUMERIC, $locale);
132                  }
133   
134                  return $repr;
135              case Escaper::requiresDoubleQuoting($value):
136                  return Escaper::escapeWithDoubleQuotes($value);
137              case Escaper::requiresSingleQuoting($value):
138                  return Escaper::escapeWithSingleQuotes($value);
139              case '' == $value:
140                  return "''";
141              case preg_match(self::getTimestampRegex(), $value):
142              case in_array(strtolower($value), array('null', '~', 'true', 'false')):
143                  return "'$value'";
144              default:
145                  return $value;
146          }
147      }
148   
149      /**
150       * Dumps a PHP array to a YAML string.
151       *
152       * @param array   $value                  The PHP array to dump
153       * @param bool    $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
154       * @param bool    $objectSupport          true if object support is enabled, false otherwise
155       *
156       * @return string The YAML string representing the PHP array
157       */
158      private static function dumpArray($value, $exceptionOnInvalidType, $objectSupport)
159      {
160          // array
161          $keys = array_keys($value);
162          if ((1 == count($keys) && '0' == $keys[0])
163              || (count($keys) > 1 && array_reduce($keys, function ($v, $w) { return (int) $v + $w; }, 0) == count($keys) * (count($keys) - 1) / 2)
164          ) {
165              $output = array();
166              foreach ($value as $val) {
167                  $output[] = self::dump($val, $exceptionOnInvalidType, $objectSupport);
168              }
169   
170              return sprintf('[%s]', implode(', ', $output));
171          }
172   
173          // mapping
174          $output = array();
175          foreach ($value as $key => $val) {
176              $output[] = sprintf('%s: %s', self::dump($key, $exceptionOnInvalidType, $objectSupport), self::dump($val, $exceptionOnInvalidType, $objectSupport));
177          }
178   
179          return sprintf('{ %s }', implode(', ', $output));
180      }
181   
182      /**
183       * Parses a scalar to a YAML string.
184       *
185       * @param scalar $scalar
186       * @param string $delimiters
187       * @param array  $stringDelimiters
188       * @param int    &$i
189       * @param bool   $evaluate
190       * @param array  $references
191       *
192       * @return string A YAML string
193       *
194       * @throws ParseException When malformed inline YAML string is parsed
195       */
196      public static function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true, $references = array())
197      {
198          if (in_array($scalar[$i], $stringDelimiters)) {
199              // quoted scalar
200              $output = self::parseQuotedScalar($scalar, $i);
201   
202              if (null !== $delimiters) {
203                  $tmp = ltrim(substr($scalar, $i), ' ');
204                  if (!in_array($tmp[0], $delimiters)) {
205                      throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)));
206                  }
207              }
208          } else {
209              // "normal" string
210              if (!$delimiters) {
211                  $output = substr($scalar, $i);
212                  $i += strlen($output);
213   
214                  // remove comments
215                  if (false !== $strpos = strpos($output, ' #')) {
216                      $output = rtrim(substr($output, 0, $strpos));
217                  }
218              } elseif (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
219                  $output = $match[1];
220                  $i += strlen($output);
221              } else {
222                  throw new ParseException(sprintf('Malformed inline YAML string (%s).', $scalar));
223              }
224   
225              if ($evaluate) {
226                  $output = self::evaluateScalar($output, $references);
227              }
228          }
229   
230          return $output;
231      }
232   
233      /**
234       * Parses a quoted scalar to YAML.
235       *
236       * @param string $scalar
237       * @param int     &$i
238       *
239       * @return string A YAML string
240       *
241       * @throws ParseException When malformed inline YAML string is parsed
242       */
243      private static function parseQuotedScalar($scalar, &$i)
244      {
245          if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
246              throw new ParseException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i)));
247          }
248   
249          $output = substr($match[0], 1, strlen($match[0]) - 2);
250   
251          $unescaper = new Unescaper();
252          if ('"' == $scalar[$i]) {
253              $output = $unescaper->unescapeDoubleQuotedString($output);
254          } else {
255              $output = $unescaper->unescapeSingleQuotedString($output);
256          }
257   
258          $i += strlen($match[0]);
259   
260          return $output;
261      }
262   
263      /**
264       * Parses a sequence to a YAML string.
265       *
266       * @param string $sequence
267       * @param int    &$i
268       * @param array  $references
269       *
270       * @return string A YAML string
271       *
272       * @throws ParseException When malformed inline YAML string is parsed
273       */
274      private static function parseSequence($sequence, &$i = 0, $references = array())
275      {
276          $output = array();
277          $len = strlen($sequence);
278          $i += 1;
279   
280          // [foo, bar, ...]
281          while ($i < $len) {
282              switch ($sequence[$i]) {
283                  case '[':
284                      // nested sequence
285                      $output[] = self::parseSequence($sequence, $i, $references);
286                      break;
287                  case '{':
288                      // nested mapping
289                      $output[] = self::parseMapping($sequence, $i, $references);
290                      break;
291                  case ']':
292                      return $output;
293                  case ',':
294                  case ' ':
295                      break;
296                  default:
297                      $isQuoted = in_array($sequence[$i], array('"', "'"));
298                      $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i, true, $references);
299   
300                      // the value can be an array if a reference has been resolved to an array var
301                      if (!is_array($value) && !$isQuoted && false !== strpos($value, ': ')) {
302                          // embedded mapping?
303                          try {
304                              $pos = 0;
305                              $value = self::parseMapping('{'.$value.'}', $pos, $references);
306                          } catch (\InvalidArgumentException $e) {
307                              // no, it's not
308                          }
309                      }
310   
311                      $output[] = $value;
312   
313                      --$i;
314              }
315   
316              ++$i;
317          }
318   
319          throw new ParseException(sprintf('Malformed inline YAML string %s', $sequence));
320      }
321   
322      /**
323       * Parses a mapping to a YAML string.
324       *
325       * @param string $mapping
326       * @param int    &$i
327       * @param array  $references
328       *
329       * @return string A YAML string
330       *
331       * @throws ParseException When malformed inline YAML string is parsed
332       */
333      private static function parseMapping($mapping, &$i = 0, $references = array())
334      {
335          $output = array();
336          $len = strlen($mapping);
337          $i += 1;
338   
339          // {foo: bar, bar:foo, ...}
340          while ($i < $len) {
341              switch ($mapping[$i]) {
342                  case ' ':
343                  case ',':
344                      ++$i;
345                      continue 2;
346                  case '}':
347                      return $output;
348              }
349   
350              // key
351              $key = self::parseScalar($mapping, array(':', ' '), array('"', "'"), $i, false);
352   
353              // value
354              $done = false;
355              while ($i < $len) {
356                  switch ($mapping[$i]) {
357                      case '[':
358                          // nested sequence
359                          $output[$key] = self::parseSequence($mapping, $i, $references);
360                          $done = true;
361                          break;
362                      case '{':
363                          // nested mapping
364                          $output[$key] = self::parseMapping($mapping, $i, $references);
365                          $done = true;
366                          break;
367                      case ':':
368                      case ' ':
369                          break;
370                      default:
371                          $output[$key] = self::parseScalar($mapping, array(',', '}'), array('"', "'"), $i, true, $references);
372                          $done = true;
373                          --$i;
374                  }
375   
376                  ++$i;
377   
378                  if ($done) {
379                      continue 2;
380                  }
381              }
382          }
383   
384          throw new ParseException(sprintf('Malformed inline YAML string %s', $mapping));
385      }
386   
387      /**
388       * Evaluates scalars and replaces magic values.
389       *
390       * @param string $scalar
391       * @param array  $references
392       *
393       * @return string A YAML string
394       *
395       * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved
396       */
397      private static function evaluateScalar($scalar, $references = array())
398      {
399          $scalar = trim($scalar);
400          $scalarLower = strtolower($scalar);
401   
402          if (0 === strpos($scalar, '*')) {
403              if (false !== $pos = strpos($scalar, '#')) {
404                  $value = substr($scalar, 1, $pos - 2);
405              } else {
406                  $value = substr($scalar, 1);
407              }
408   
409              // an unquoted *
410              if (false === $value || '' === $value) {
411                  throw new ParseException('A reference must contain at least one character.');
412              }
413   
414              if (!array_key_exists($value, $references)) {
415                  throw new ParseException(sprintf('Reference "%s" does not exist.', $value));
416              }
417   
418              return $references[$value];
419          }
420   
421          switch (true) {
422              case 'null' === $scalarLower:
423              case '' === $scalar:
424              case '~' === $scalar:
425                  return;
426              case 'true' === $scalarLower:
427                  return true;
428              case 'false' === $scalarLower:
429                  return false;
430              // Optimise for returning strings.
431              case $scalar[0] === '+' || $scalar[0] === '-' || $scalar[0] === '.' || $scalar[0] === '!' || is_numeric($scalar[0]):
432                  switch (true) {
433                      case 0 === strpos($scalar, '!str'):
434                          return (string) substr($scalar, 5);
435                      case 0 === strpos($scalar, '! '):
436                          return intval(self::parseScalar(substr($scalar, 2)));
437                      case 0 === strpos($scalar, '!!php/object:'):
438                          if (self::$objectSupport) {
439                              return unserialize(substr($scalar, 13));
440                          }
441   
442                          if (self::$exceptionOnInvalidType) {
443                              throw new ParseException('Object support when parsing a YAML file has been disabled.');
444                          }
445   
446                          return;
447                      case ctype_digit($scalar):
448                          $raw = $scalar;
449                          $cast = intval($scalar);
450   
451                          return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
452                      case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
453                          $raw = $scalar;
454                          $cast = intval($scalar);
455   
456                          return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
457                      case is_numeric($scalar):
458                          return '0x' == $scalar[0].$scalar[1] ? hexdec($scalar) : floatval($scalar);
459                      case '.inf' === $scalarLower:
460                      case '.nan' === $scalarLower:
461                          return -log(0);
462                      case '-.inf' === $scalarLower:
463                          return log(0);
464                      case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
465                          return floatval(str_replace(',', '', $scalar));
466                      case preg_match(self::getTimestampRegex(), $scalar):
467                          return strtotime($scalar);
468                  }
469              default:
470                  return (string) $scalar;
471          }
472      }
473   
474      /**
475       * Gets a regex that matches a YAML date.
476       *
477       * @return string The regular expression
478       *
479       * @see http://www.yaml.org/spec/1.2/spec.html#id2761573
480       */
481      private static function getTimestampRegex()
482      {
483          return <<<EOF
484          ~^
485          (?P<year>[0-9][0-9][0-9][0-9])
486          -(?P<month>[0-9][0-9]?)
487          -(?P<day>[0-9][0-9]?)
488          (?:(?:[Tt]|[ \t]+)
489          (?P<hour>[0-9][0-9]?)
490          :(?P<minute>[0-9][0-9])
491          :(?P<second>[0-9][0-9])
492          (?:\.(?P<fraction>[0-9]*))?
493          (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
494          (?::(?P<tz_minute>[0-9][0-9]))?))?)?
495          $~x
496  EOF;
497   
498      }
499  }
500