You are here

class Parser in Zircon Profile 8

Same name in this branch
  1. 8 vendor/symfony/yaml/Parser.php \Symfony\Component\Yaml\Parser
  2. 8 vendor/sebastian/diff/src/Parser.php \SebastianBergmann\Diff\Parser
  3. 8 vendor/symfony/css-selector/Parser/Parser.php \Symfony\Component\CssSelector\Parser\Parser
  4. 8 vendor/egulias/email-validator/src/Egulias/EmailValidator/Parser/Parser.php \Egulias\EmailValidator\Parser\Parser
Same name and namespace in other branches
  1. 8.0 vendor/sebastian/diff/src/Parser.php \SebastianBergmann\Diff\Parser

Unified diff parser.

@package Diff @author Sebastian Bergmann <sebastian@phpunit.de> @author Kore Nordmann <mail@kore-nordmann.de> @copyright Sebastian Bergmann <sebastian@phpunit.de> @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License @link http://www.github.com/sebastianbergmann/diff

Hierarchy

  • class \SebastianBergmann\Diff\Parser

Expanded class hierarchy of Parser

2 string references to 'Parser'
aggregator.schema.yml in core/modules/aggregator/config/schema/aggregator.schema.yml
core/modules/aggregator/config/schema/aggregator.schema.yml
SettingsForm::buildForm in core/modules/aggregator/src/Form/SettingsForm.php
Form constructor.

File

vendor/sebastian/diff/src/Parser.php, line 23

Namespace

SebastianBergmann\Diff
View source
class Parser {

  /**
   * @param  string $string
   * @return Diff[]
   */
  public function parse($string) {
    $lines = preg_split('(\\r\\n|\\r|\\n)', $string);
    $lineCount = count($lines);
    $diffs = array();
    $diff = null;
    $collected = array();
    for ($i = 0; $i < $lineCount; ++$i) {
      if (preg_match('(^---\\s+(?P<file>\\S+))', $lines[$i], $fromMatch) && preg_match('(^\\+\\+\\+\\s+(?P<file>\\S+))', $lines[$i + 1], $toMatch)) {
        if ($diff !== null) {
          $this
            ->parseFileDiff($diff, $collected);
          $diffs[] = $diff;
          $collected = array();
        }
        $diff = new Diff($fromMatch['file'], $toMatch['file']);
        ++$i;
      }
      else {
        if (preg_match('/^(?:diff --git |index [\\da-f\\.]+|[+-]{3} [ab])/', $lines[$i])) {
          continue;
        }
        $collected[] = $lines[$i];
      }
    }
    if (count($collected) && $diff !== null) {
      $this
        ->parseFileDiff($diff, $collected);
      $diffs[] = $diff;
    }
    return $diffs;
  }

  /**
   * @param Diff  $diff
   * @param array $lines
   */
  private function parseFileDiff(Diff $diff, array $lines) {
    $chunks = array();
    foreach ($lines as $line) {
      if (preg_match('/^@@\\s+-(?P<start>\\d+)(?:,\\s*(?P<startrange>\\d+))?\\s+\\+(?P<end>\\d+)(?:,\\s*(?P<endrange>\\d+))?\\s+@@/', $line, $match)) {
        $chunk = new Chunk($match['start'], isset($match['startrange']) ? max(1, $match['startrange']) : 1, $match['end'], isset($match['endrange']) ? max(1, $match['endrange']) : 1);
        $chunks[] = $chunk;
        $diffLines = array();
        continue;
      }
      if (preg_match('/^(?P<type>[+ -])?(?P<line>.*)/', $line, $match)) {
        $type = Line::UNCHANGED;
        if ($match['type'] == '+') {
          $type = Line::ADDED;
        }
        elseif ($match['type'] == '-') {
          $type = Line::REMOVED;
        }
        $diffLines[] = new Line($type, $match['line']);
        if (isset($chunk)) {
          $chunk
            ->setLines($diffLines);
        }
      }
    }
    $diff
      ->setChunks($chunks);
  }

}

Members