You are here

private function Parser::getNextEmbedBlock in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/symfony/yaml/Parser.php \Symfony\Component\Yaml\Parser::getNextEmbedBlock()

Returns the next embed block of YAML.

Parameters

int $indentation The indent level at which the block is to be read, or null for default:

bool $inSequence True if the enclosing data structure is a sequence:

Return value

string A YAML string

Throws

ParseException When indentation problem are detected

1 call to Parser::getNextEmbedBlock()
Parser::parse in vendor/symfony/yaml/Parser.php
Parses a YAML string to a PHP value.

File

vendor/symfony/yaml/Parser.php, line 339

Class

Parser
Parser parses YAML strings to convert them to PHP arrays.

Namespace

Symfony\Component\Yaml

Code

private function getNextEmbedBlock($indentation = null, $inSequence = false) {
  $oldLineIndentation = $this
    ->getCurrentLineIndentation();
  if (!$this
    ->moveToNextLine()) {
    return;
  }
  if (null === $indentation) {
    $newIndent = $this
      ->getCurrentLineIndentation();
    $unindentedEmbedBlock = $this
      ->isStringUnIndentedCollectionItem($this->currentLine);
    if (!$this
      ->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
      throw new ParseException('Indentation problem.', $this
        ->getRealCurrentLineNb() + 1, $this->currentLine);
    }
  }
  else {
    $newIndent = $indentation;
  }
  $data = array();
  if ($this
    ->getCurrentLineIndentation() >= $newIndent) {
    $data[] = substr($this->currentLine, $newIndent);
  }
  else {
    $this
      ->moveToPreviousLine();
    return;
  }
  if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) {

    // the previous line contained a dash but no item content, this line is a sequence item with the same indentation
    // and therefore no nested list or mapping
    $this
      ->moveToPreviousLine();
    return;
  }
  $isItUnindentedCollection = $this
    ->isStringUnIndentedCollectionItem($this->currentLine);

  // Comments must not be removed inside a block scalar
  $removeCommentsPattern = '~' . self::BLOCK_SCALAR_HEADER_PATTERN . '$~';
  $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
  while ($this
    ->moveToNextLine()) {
    $indent = $this
      ->getCurrentLineIndentation();
    if ($indent === $newIndent) {
      $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
    }
    if ($isItUnindentedCollection && !$this
      ->isStringUnIndentedCollectionItem($this->currentLine) && $newIndent === $indent) {
      $this
        ->moveToPreviousLine();
      break;
    }
    if ($this
      ->isCurrentLineBlank()) {
      $data[] = substr($this->currentLine, $newIndent);
      continue;
    }
    if ($removeComments && $this
      ->isCurrentLineComment()) {
      continue;
    }
    if ($indent >= $newIndent) {
      $data[] = substr($this->currentLine, $newIndent);
    }
    elseif (0 == $indent) {
      $this
        ->moveToPreviousLine();
      break;
    }
    else {
      throw new ParseException('Indentation problem.', $this
        ->getRealCurrentLineNb() + 1, $this->currentLine);
    }
  }
  return implode("\n", $data);
}