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 = []; } /** * {@inheritdoc} */ protected function _end_diff() { return $this->rows; } /** * {@inheritdoc} */ protected function _block_header($xbeg, $xlen, $ybeg, $ylen) { return [ [ 'data' => $xbeg + $this->line_stats['offset']['x'], 'colspan' => 2, ], [ '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 [ [ 'data' => '+', 'class' => 'diff-marker', ], [ '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 [ [ 'data' => '-', 'class' => 'diff-marker', ], [ '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 [ ' ', [ 'data' => ['#markup' => $line], 'class' => 'diff-context', ], ]; } /** * Creates an empty line. * * @return array * An array representing a table row. */ protected function emptyLine() { return [ ' ', ' ', ]; } /** * {@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)); } } }