Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Inline.php

function Inline::evaluateScalar

Evaluates scalars and replaces magic values.

Throws

ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved

2 calls to Inline::evaluateScalar()
Inline::parseMapping in vendor/symfony/yaml/Inline.php
Parses a YAML mapping.
Inline::parseScalar in vendor/symfony/yaml/Inline.php
Parses a YAML scalar.

File

vendor/symfony/yaml/Inline.php, line 567

Class

Inline
Inline implements a YAML parser/dumper for the YAML inline syntax.

Namespace

Symfony\Component\Yaml

Code

private static function evaluateScalar(string $scalar, int $flags, array &$references = [], ?bool &$isQuotedString = null) : mixed {
    $isQuotedString = false;
    $scalar = trim($scalar);
    if (str_starts_with($scalar, '*')) {
        if (false !== ($pos = strpos($scalar, '#'))) {
            $value = substr($scalar, 1, $pos - 2);
        }
        else {
            $value = substr($scalar, 1);
        }
        // an unquoted *
        if ('' === $value) {
            throw new ParseException('A reference must contain at least one character.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);
        }
        if (!\array_key_exists($value, $references)) {
            throw new ParseException(\sprintf('Reference "%s" does not exist.', $value), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
        }
        return $references[$value];
    }
    $scalarLower = strtolower($scalar);
    switch (true) {
        case 'null' === $scalarLower:
        case '' === $scalar:
        case '~' === $scalar:
            return null;
        case 'true' === $scalarLower:
            return true;
        case 'false' === $scalarLower:
            return false;
        case '!' === $scalar[0]:
            switch (true) {
                case str_starts_with($scalar, '!!str '):
                    $s = substr($scalar, 6);
                    if (\in_array($s[0] ?? '', [
                        '"',
                        "'",
                    ], true)) {
                        $isQuotedString = true;
                        $s = self::parseQuotedScalar($s);
                    }
                    return $s;
                case str_starts_with($scalar, '! '):
                    return substr($scalar, 2);
                case str_starts_with($scalar, '!php/object'):
                    if (self::$objectSupport) {
                        if (!isset($scalar[12])) {
                            throw new ParseException('Missing value for tag "!php/object".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                        }
                        return unserialize(self::parseScalar(substr($scalar, 12)));
                    }
                    if (self::$exceptionOnInvalidType) {
                        throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                    }
                    return null;
                case str_starts_with($scalar, '!php/const'):
                    if (self::$constantSupport) {
                        if (!isset($scalar[11])) {
                            throw new ParseException('Missing value for tag "!php/const".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                        }
                        $i = 0;
                        if (\defined($const = self::parseScalar(substr($scalar, 11), 0, null, $i, false))) {
                            return \constant($const);
                        }
                        throw new ParseException(\sprintf('The constant "%s" is not defined.', $const), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                    }
                    if (self::$exceptionOnInvalidType) {
                        throw new ParseException(\sprintf('The string "%s" could not be parsed as a constant. Did you forget to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                    }
                    return null;
                case str_starts_with($scalar, '!php/enum'):
                    if (self::$constantSupport) {
                        if (!isset($scalar[11])) {
                            throw new ParseException('Missing value for tag "!php/enum".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                        }
                        $i = 0;
                        $enumName = self::parseScalar(substr($scalar, 10), 0, null, $i, false);
                        $useName = str_contains($enumName, '::');
                        $enum = $useName ? strstr($enumName, '::', true) : $enumName;
                        if (!enum_exists($enum)) {
                            throw new ParseException(\sprintf('The enum "%s" is not defined.', $enum), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                        }
                        if (!$useName) {
                            return $enum::cases();
                        }
                        if ($useValue = str_ends_with($enumName, '->value')) {
                            $enumName = substr($enumName, 0, -7);
                        }
                        if (!\defined($enumName)) {
                            throw new ParseException(\sprintf('The string "%s" is not the name of a valid enum.', $enumName), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                        }
                        $value = \constant($enumName);
                        if (!$useValue) {
                            return $value;
                        }
                        if (!$value instanceof \BackedEnum) {
                            throw new ParseException(\sprintf('The enum "%s" defines no value next to its name.', $enumName), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                        }
                        return $value->value;
                    }
                    if (self::$exceptionOnInvalidType) {
                        throw new ParseException(\sprintf('The string "%s" could not be parsed as an enum. Did you forget to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                    }
                    return null;
                case str_starts_with($scalar, '!!float '):
                    return (double) substr($scalar, 8);
                case str_starts_with($scalar, '!!binary '):
                    return self::evaluateBinaryScalar(substr($scalar, 9));
            }
            throw new ParseException(\sprintf('The string "%s" could not be parsed as it uses an unsupported built-in tag.', $scalar), self::$parsedLineNumber, $scalar, self::$parsedFilename);
        case preg_match('/^(?:\\+|-)?0o(?P<value>[0-7_]++)$/', $scalar, $matches):
            $value = str_replace('_', '', $matches['value']);
            if ('-' === $scalar[0]) {
                return -octdec($value);
            }
            return octdec($value);
        case \in_array($scalar[0], [
            '+',
            '-',
            '.',
        ], true) || is_numeric($scalar[0]):
            if (Parser::preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar)) {
                $scalar = str_replace('_', '', $scalar);
            }
            switch (true) {
                case ctype_digit($scalar):
                case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
                    $cast = (int) $scalar;
                    return $scalar === (string) $cast ? $cast : $scalar;
                case is_numeric($scalar):
                case Parser::preg_match(self::getHexRegex(), $scalar):
                    $scalar = str_replace('_', '', $scalar);
                    return '0x' === $scalar[0] . $scalar[1] ? hexdec($scalar) : (double) $scalar;
                case '.inf' === $scalarLower:
                case '.nan' === $scalarLower:
                    return -log(0);
                case '-.inf' === $scalarLower:
                    return log(0);
                case Parser::preg_match('/^(-|\\+)?[0-9][0-9_]*(\\.[0-9_]+)?$/', $scalar):
                    return (double) str_replace('_', '', $scalar);
                case Parser::preg_match(self::getTimestampRegex(), $scalar):
                    try {
                        // When no timezone is provided in the parsed date, YAML spec says we must assume UTC.
                        $time = new \DateTimeImmutable($scalar, new \DateTimeZone('UTC'));
                    } catch (\Exception $e) {
                        // Some dates accepted by the regex are not valid dates.
                        throw new ParseException(\sprintf('The date "%s" could not be parsed as it is an invalid date.', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename, $e);
                    }
                    if (Yaml::PARSE_DATETIME & $flags) {
                        return $time;
                    }
                    if ('' !== rtrim($time->format('u'), '0')) {
                        return (double) $time->format('U.u');
                    }
                    try {
                        if (false !== ($scalar = $time->getTimestamp())) {
                            return $scalar;
                        }
                    } catch (\ValueError) {
                        // no-op
                    }
                    return $time->format('U');
            }
    }
    return (string) $scalar;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal