You are here

public function DiffFormatter::format in Drupal 9

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Component/Diff/DiffFormatter.php \Drupal\Component\Diff\DiffFormatter::format()

Format a diff.

Parameters

\Drupal\Component\Diff\Diff $diff: A Diff object.

Return value

string The formatted output.

File

core/lib/Drupal/Component/Diff/DiffFormatter.php, line 58

Class

DiffFormatter
A class to format Diffs

Namespace

Drupal\Component\Diff

Code

public function format(Diff $diff) {
  $xi = $yi = 1;
  $block = FALSE;
  $context = [];
  $nlead = $this->leading_context_lines;
  $ntrail = $this->trailing_context_lines;
  $this
    ->_start_diff();
  foreach ($diff
    ->getEdits() as $edit) {
    if ($edit->type == 'copy') {
      if (is_array($block)) {
        if (sizeof($edit->orig) <= $nlead + $ntrail) {
          $block[] = $edit;
        }
        else {
          if ($ntrail) {
            $context = array_slice($edit->orig, 0, $ntrail);
            $block[] = new DiffOpCopy($context);
          }
          $this
            ->_block($x0, $ntrail + $xi - $x0, $y0, $ntrail + $yi - $y0, $block);
          $block = FALSE;
        }
      }
      $context = $edit->orig;
    }
    else {
      if (!is_array($block)) {
        $context = array_slice($context, sizeof($context) - $nlead);
        $x0 = $xi - sizeof($context);
        $y0 = $yi - sizeof($context);
        $block = [];
        if ($context) {
          $block[] = new DiffOpCopy($context);
        }
      }
      $block[] = $edit;
    }
    if ($edit->orig) {
      $xi += sizeof($edit->orig);
    }
    if ($edit->closing) {
      $yi += sizeof($edit->closing);
    }
  }
  if (is_array($block)) {
    $this
      ->_block($x0, $xi - $x0, $y0, $yi - $y0, $block);
  }
  $end = $this
    ->_end_diff();
  if (!empty($xi)) {
    $this->line_stats['counter']['x'] += $xi;
  }
  if (!empty($yi)) {
    $this->line_stats['counter']['y'] += $yi;
  }
  return $end;
}