Chris@0: ['x' => 0, 'y' => 0], Chris@0: 'offset' => ['x' => 0, 'y' => 0], Chris@0: ]; Chris@0: Chris@0: /** Chris@0: * Format a diff. Chris@0: * Chris@0: * @param \Drupal\Component\Diff\Diff $diff Chris@0: * A Diff object. Chris@0: * Chris@0: * @return string Chris@0: * The formatted output. Chris@0: */ Chris@0: public function format(Diff $diff) { Chris@0: $xi = $yi = 1; Chris@0: $block = FALSE; Chris@0: $context = []; Chris@0: Chris@0: $nlead = $this->leading_context_lines; Chris@0: $ntrail = $this->trailing_context_lines; Chris@0: Chris@0: $this->_start_diff(); Chris@0: Chris@0: foreach ($diff->getEdits() as $edit) { Chris@0: if ($edit->type == 'copy') { Chris@0: if (is_array($block)) { Chris@0: if (sizeof($edit->orig) <= $nlead + $ntrail) { Chris@0: $block[] = $edit; Chris@0: } Chris@0: else { Chris@0: if ($ntrail) { Chris@0: $context = array_slice($edit->orig, 0, $ntrail); Chris@0: $block[] = new DiffOpCopy($context); Chris@0: } Chris@0: $this->_block($x0, $ntrail + $xi - $x0, $y0, $ntrail + $yi - $y0, $block); Chris@0: $block = FALSE; Chris@0: } Chris@0: } Chris@0: $context = $edit->orig; Chris@0: } Chris@0: else { Chris@0: if (!is_array($block)) { Chris@0: $context = array_slice($context, sizeof($context) - $nlead); Chris@0: $x0 = $xi - sizeof($context); Chris@0: $y0 = $yi - sizeof($context); Chris@0: $block = []; Chris@0: if ($context) { Chris@0: $block[] = new DiffOpCopy($context); Chris@0: } Chris@0: } Chris@0: $block[] = $edit; Chris@0: } Chris@0: Chris@0: if ($edit->orig) { Chris@0: $xi += sizeof($edit->orig); Chris@0: } Chris@0: if ($edit->closing) { Chris@0: $yi += sizeof($edit->closing); Chris@0: } Chris@0: } Chris@0: Chris@0: if (is_array($block)) { Chris@0: $this->_block($x0, $xi - $x0, $y0, $yi - $y0, $block); Chris@0: } Chris@0: $end = $this->_end_diff(); Chris@0: Chris@0: if (!empty($xi)) { Chris@0: $this->line_stats['counter']['x'] += $xi; Chris@0: } Chris@0: if (!empty($yi)) { Chris@0: $this->line_stats['counter']['y'] += $yi; Chris@0: } Chris@0: Chris@0: return $end; Chris@0: } Chris@0: Chris@0: protected function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) { Chris@0: $this->_start_block($this->_block_header($xbeg, $xlen, $ybeg, $ylen)); Chris@0: foreach ($edits as $edit) { Chris@0: if ($edit->type == 'copy') { Chris@0: $this->_context($edit->orig); Chris@0: } Chris@0: elseif ($edit->type == 'add') { Chris@0: $this->_added($edit->closing); Chris@0: } Chris@0: elseif ($edit->type == 'delete') { Chris@0: $this->_deleted($edit->orig); Chris@0: } Chris@0: elseif ($edit->type == 'change') { Chris@0: $this->_changed($edit->orig, $edit->closing); Chris@0: } Chris@0: else { Chris@0: trigger_error('Unknown edit type', E_USER_ERROR); Chris@0: } Chris@0: } Chris@0: $this->_end_block(); Chris@0: } Chris@0: Chris@0: protected function _start_diff() { Chris@0: ob_start(); Chris@0: } Chris@0: Chris@0: protected function _end_diff() { Chris@0: $val = ob_get_contents(); Chris@0: ob_end_clean(); Chris@0: return $val; Chris@0: } Chris@0: Chris@0: protected function _block_header($xbeg, $xlen, $ybeg, $ylen) { Chris@0: if ($xlen > 1) { Chris@0: $xbeg .= "," . ($xbeg + $xlen - 1); Chris@0: } Chris@0: if ($ylen > 1) { Chris@0: $ybeg .= "," . ($ybeg + $ylen - 1); Chris@0: } Chris@0: Chris@0: return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg; Chris@0: } Chris@0: Chris@0: protected function _start_block($header) { Chris@0: if ($this->show_header) { Chris@0: echo $header . "\n"; Chris@0: } Chris@0: } Chris@0: Chris@0: protected function _end_block() { Chris@0: } Chris@0: Chris@0: protected function _lines($lines, $prefix = ' ') { Chris@0: foreach ($lines as $line) { Chris@0: echo "$prefix $line\n"; Chris@0: } Chris@0: } Chris@0: Chris@0: protected function _context($lines) { Chris@0: $this->_lines($lines); Chris@0: } Chris@0: Chris@0: protected function _added($lines) { Chris@0: $this->_lines($lines, '>'); Chris@0: } Chris@0: Chris@0: protected function _deleted($lines) { Chris@0: $this->_lines($lines, '<'); Chris@0: } Chris@0: Chris@0: protected function _changed($orig, $closing) { Chris@0: $this->_deleted($orig); Chris@0: echo "---\n"; Chris@0: $this->_added($closing); Chris@0: } Chris@0: Chris@0: }