Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 14
CRAP
0.00% covered (danger)
0.00%
0 / 84
DiffFormatter
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 14
462
0.00% covered (danger)
0.00%
0 / 84
 __construct
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 4
 _start_diff
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 _end_diff
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 _block_header
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 11
 _start_block
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 _lines
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 addedLine
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 11
 deletedLine
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 11
 contextLine
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 8
 emptyLine
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 5
 _added
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 _deleted
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 _context
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 _changed
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 13
<?php
/**
 * @file
 * Contains \Drupal\Core\Diff\DiffFormatter.
 */
namespace Drupal\Core\Diff;
use Drupal\Component\Diff\DiffFormatter as DiffFormatterBase;
use Drupal\Component\Diff\WordLevelDiff;
use Drupal\Component\Utility\Html;
use Drupal\Core\Config\ConfigFactoryInterface;
/**
 * Diff formatter which uses returns output that can be rendered to a table.
 */
class DiffFormatter extends DiffFormatterBase {
  /**
   * The diff represented as an array of rows.
   *
   * @var array
   */
  protected $rows = array();
  /**
   * The line stats.
   *
   * @var array
   */
  protected $line_stats = array(
    'counter' => array('x' => 0, 'y' => 0),
    'offset' => array('x' => 0, 'y' => 0),
  );
  /**
   * Creates a DiffFormatter to render diffs in a table.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The config factory.
   */
  public function __construct(ConfigFactoryInterface $config_factory) {
    $config = $config_factory->get('system.diff');
    $this->leading_context_lines = $config->get('context.lines_leading');
    $this->trailing_context_lines = $config->get('context.lines_trailing');
  }
  /**
   * {@inheritdoc}
   */
  protected function _start_diff() {
    $this->rows = array();
  }
  /**
   * {@inheritdoc}
   */
  protected function _end_diff() {
    return $this->rows;
  }
  /**
   * {@inheritdoc}
   */
  protected function _block_header($xbeg, $xlen, $ybeg, $ylen) {
    return array(
      array(
        'data' => $xbeg + $this->line_stats['offset']['x'],
        'colspan' => 2,
      ),
      array(
        'data' => $ybeg + $this->line_stats['offset']['y'],
        'colspan' => 2,
      )
    );
  }
  /**
   * {@inheritdoc}
   */
  protected function _start_block($header) {
    if ($this->show_header) {
      $this->rows[] = $header;
    }
  }
  /**
   * {@inheritdoc}
   */
  protected function _lines($lines, $prefix=' ', $color='white') {
  }
  /**
   * Creates an added line.
   *
   * @param string $line
   *   An HTML-escaped line.
   *
   * @return array
   *   An array representing a table row.
   */
  protected function addedLine($line) {
    return array(
      array(
        'data' => '+',
        'class' => 'diff-marker',
      ),
      array(
        'data' => ['#markup' => $line],
        'class' => 'diff-context diff-addedline',
      )
    );
  }
  /**
   * Creates a deleted line.
   *
   * @param string $line
   *   An HTML-escaped line.
   *
   * @return array
   *   An array representing a table row.
   */
  protected function deletedLine($line) {
    return array(
      array(
        'data' => '-',
        'class' => 'diff-marker',
      ),
      array(
        'data' => ['#markup' => $line],
        'class' => 'diff-context diff-deletedline',
      )
    );
  }
  /**
   * Creates a context line.
   *
   * @param string $line
   *   An HTML-escaped line.
   *
   * @return array
   *   An array representing a table row.
   */
  protected function contextLine($line) {
    return array(
      ' ',
      array(
        'data' => ['#markup' => $line],
        'class' => 'diff-context',
      )
    );
  }
  /**
   * Creates an empty line.
   *
   * @return array
   *   An array representing a table row.
   */
  protected function emptyLine() {
    return array(
      ' ',
      ' ',
    );
  }
  /**
   * {@inheritdoc}
   */
  protected function _added($lines) {
    foreach ($lines as $line) {
      $this->rows[] = array_merge($this->emptyLine(), $this->addedLine(Html::escape($line)));
    }
  }
  /**
   * {@inheritdoc}
   */
  protected function _deleted($lines) {
    foreach ($lines as $line) {
      $this->rows[] = array_merge($this->deletedLine(Html::escape($line)), $this->emptyLine());
    }
  }
  /**
   * {@inheritdoc}
   */
  protected function _context($lines) {
    foreach ($lines as $line) {
      $this->rows[] = array_merge($this->contextLine(Html::escape($line)), $this->contextLine(Html::escape($line)));
    }
  }
  /**
   * {@inheritdoc}
   */
  protected function _changed($orig, $closing) {
    $orig = array_map('\Drupal\Component\Utility\Html::escape', $orig);
    $closing = array_map('\Drupal\Component\Utility\Html::escape', $closing);
    $diff = new WordLevelDiff($orig, $closing);
    $del = $diff->orig();
    $add = $diff->closing();
    // Notice that WordLevelDiff returns HTML-escaped output. Hence, we will be
    // calling addedLine/deletedLine without HTML-escaping.
    while ($line = array_shift($del)) {
      $aline = array_shift( $add );
      $this->rows[] = array_merge($this->deletedLine($line), isset($aline) ? $this->addedLine($aline) : $this->emptyLine());
    }
    // If any leftovers.
    foreach ($add as $line) {
      $this->rows[] = array_merge($this->emptyLine(), $this->addedLine($line));
    }
  }
}