You are here

private function Parser::getNextEmbedBlock in Lockr 7.3

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::doParse in vendor/symfony/yaml/Parser.php

File

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

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 = null;
    $movements = 0;
    do {
      $EOF = false;

      // empty and comment-like lines do not influence the indentation depth
      if ($this
        ->isCurrentLineEmpty() || $this
        ->isCurrentLineComment()) {
        $EOF = !$this
          ->moveToNextLine();
        if (!$EOF) {
          ++$movements;
        }
      }
      else {
        $newIndent = $this
          ->getCurrentLineIndentation();
      }
    } while (!$EOF && null === $newIndent);
    for ($i = 0; $i < $movements; ++$i) {
      $this
        ->moveToPreviousLine();
    }
    $unindentedEmbedBlock = $this
      ->isStringUnIndentedCollectionItem();
    if (!$this
      ->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
      throw new ParseException('Indentation problem.', $this
        ->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
    }
  }
  else {
    $newIndent = $indentation;
  }
  $data = [];
  if ($this
    ->getCurrentLineIndentation() >= $newIndent) {
    $data[] = substr($this->currentLine, $newIndent);
  }
  elseif ($this
    ->isCurrentLineEmpty() || $this
    ->isCurrentLineComment()) {
    $data[] = $this->currentLine;
  }
  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();
  while ($this
    ->moveToNextLine()) {
    $indent = $this
      ->getCurrentLineIndentation();
    if ($isItUnindentedCollection && !$this
      ->isCurrentLineEmpty() && !$this
      ->isStringUnIndentedCollectionItem() && $newIndent === $indent) {
      $this
        ->moveToPreviousLine();
      break;
    }
    if ($this
      ->isCurrentLineBlank()) {
      $data[] = substr($this->currentLine, $newIndent);
      continue;
    }
    if ($indent >= $newIndent) {
      $data[] = substr($this->currentLine, $newIndent);
    }
    elseif ($this
      ->isCurrentLineComment()) {
      $data[] = $this->currentLine;
    }
    elseif (0 == $indent) {
      $this
        ->moveToPreviousLine();
      break;
    }
    else {
      throw new ParseException('Indentation problem.', $this
        ->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
    }
  }
  return implode("\n", $data);
}